Laravel使用模型作为字符串进行路由并使用预先加载 - 循环引用

时间:2016-08-01 05:39:19

标签: php laravel laravel-5

我正在尝试使用Laravel 5.1简化我的模型的路由。我有两个资源,问题和类别,它们继承自ResourceController

$router->get('/categories', 'Resources\Categories@index');
$router->get('/questions', 'Resources\Questions@index');

ResourceController.php中,我的资源类使用此index方法:

public function index(Request $request, Route $route)
{
    // Converts route name into namespaced Model string
    // E.g: App\Http\Controllers\Resources\Questions@index -> App\Question
    $model = $this->getModelClass($route->getActionName());

    return $model::all();
}

This SO post说我可以使用完全限定的字符串调用一个雄辩的方法:

$model_name = 'App\Model\User';
$model_name::where('id', $id)->first();

如果我返回$model,我会获得App\CategoryApp\Question的相应路线。这很好!

如果我返回$model::all(),我会收到 500错误但没有数据。

我检查了我的续集专业版查询记录器,发现questionscategories被调用了大约20次以上,即使我一次只向一条路线发出请求。

enter image description here

为什么会这样?这可以解释500错误。当只有一个资源使用此父index方法时,我能够获取模型。

QuestionsCategories都依赖于同一index时,错误就会开始。我不明白为什么这是冲突,因为路由使用模型名称将特定调用发送到索引。

编辑:我认为这与我指定预先加载的方式有关:

Category.php型号:

protected $with = ['questions'];

Question.php型号:

protected $with = ['category'];

所以它似乎是一个循环引用,其中加载问题将带有类别,这反过来会加载相关问题,等等。

但实际上我需要每个人加载关系。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

答案在于here

它确实似乎是一个循环引用。如果你想要一个通用的模型加载器,那么应​​该在查询上发生渴望加载,而不是在模型上:

在我的模型中,我将$with更改为常量,我可以加载自己:

class Category extends BaseModel
{
    // Removed: protected $with = ['questions'];
    const EAGER_LOAD = ['questions'];

在父资源控制器中,我在这里加载常量:

public function index(Request $request, Route $route)
{
    $model = $this->getModelClass($route->getActionName());

    return $model->with($model::EAGER_LOAD)->get();
}