我正在尝试使用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\Category
和App\Question
的相应路线。这很好!
如果我返回$model::all()
,我会收到 500错误但没有数据。
我检查了我的续集专业版查询记录器,发现questions
和categories
被调用了大约20次以上,即使我一次只向一条路线发出请求。
为什么会这样?这可以解释500错误。当只有一个资源使用此父index
方法时,我能够获取模型。
当Questions
和Categories
都依赖于同一index
时,错误就会开始。我不明白为什么这是冲突,因为路由使用模型名称将特定调用发送到索引。
编辑:我认为这与我指定预先加载的方式有关:
Category.php
型号:
protected $with = ['questions'];
Question.php
型号:
protected $with = ['category'];
所以它似乎是一个循环引用,其中加载问题将带有类别,这反过来会加载相关问题,等等。
但实际上我需要每个人加载关系。我该如何解决这个问题?
答案 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();
}