Laravel 5.6 将 eloquent 模型作为参数传递给函数

Laravel 5.6 passing eloquent model as parameter to a function

我在 blade 表单上有一个选择控件,要通过此函数通过 ajax 刷新:

function getOpciones(tbName) {
    $.get('/ajax/read-data/' + tbName, function(data){
    return (data);
});
}

该函数采用一个字符串变量 'tbName',其中包含与控件相关的 table 的名称,并将其作为参数传递给路由:

Route::get('/ajax/read-data/{modelo}', 'AjaxController@readData');

然后controller应该获取参数{modelo},并检索其中的记录table:

use App\RegFiscal;

public function readData($modelo) {
    $arreglo = $modelo::all();
    return response($arreglo);
}

但是即使我用 'use App\RegFiscal' 引用模型,我得到的只是 laravel 日志中的这个错误:

2018-03-23 18:52:08] local.ERROR: exception 'Symfony\Component\Debug\Exception\FatalErrorException' with message 'Class 'RegFiscal' not found' in C:\wamp64\www\laravel\cte\app\Http\Controllers\AjaxController.php:32

我是 Laravel 的新手,不用说我迷路了,我们将不胜感激。谢谢!

仅仅因为你 use App\RegFiscal 并不意味着 $modelo 与之关联。

不过,您可以使用 app("App\$modelo") 根据您从路由器获得的参数加载您的模型。您也不再需要 use App\RegFiscal

$arreglo = app("App\$modelo");
return response($arreglo::all());

这是假设您的模型存储在 Laravel 项目中的默认 app 目录中。如果不是,您可以将 "App\" 更改为它的存储位置。例如,如果您的模型在 app\models\modelname.php 中,它将是 "App\Models\$modelo".

您可以按照以下方式进行操作:

public function readData($modelo) {
$modelName = '\App' . '\' . $modelo;
$class = new $modelName();
arreglo = $class::all();
return response($arreglo);

}

对于那些像我一样想要将它注入构造函数的人,这里是如何做到的:

~$ php artisan make:provider MyProvider

然后像这样覆盖注册函数:

class MyProvider implements ServiceProvider {

    /** @override */
    public function register() {
        $this->app->bind(ShapeInterface::class, function ($app) {
            return new Square($app->make(MyModel::class));
        });
    }
}

ShapeInterface是一个简单的接口,Square是一个简单的class,它使用eloquent模型的构造函数参数实现形状接口。

class Square implements ShapeInterface {
    private MyModel $model;

    function __construct(MyModel $model) {
        $this->model = $model;
    }

    ...
}