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

时间:2018-03-23 19:20:10

标签: php ajax laravel-5.6

我在刀片表单上有一个选择控件,可以通过此函数通过ajax刷新:

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

该函数接受一个字符串变量'tbName',其中包含控件所关联的表的名称,并将其作为参数传递给路径:

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

然后控制器应获取参数{modelo},并检索该表中的记录:

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:异常   带有消息的'Symfony \ Component \ Debug \ Exception \ FatalErrorException'   '未找到'等级'RegFiscal'   C:\ wamp64 \ WWW \ laravel \ CTE \应用\ HTTP \控制器\ AjaxController.php:32

我是Laravel的新手,所以不用说我迷失了,任何帮助都会非常感激。谢谢!

3 个答案:

答案 0 :(得分:1)

仅仅因为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"

答案 1 :(得分:1)

您可以执行以下操作:

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

}

答案 2 :(得分:0)

对于像我这样想在构造函数中注入它的人,这里是如何做到的:

~$ 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 是一个简单的类,它使用 eloquent 模型的构造函数参数实现了形状接口。

class Square implements ShapeInterface {
    private MyModel $model;

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

    ...
}