Laravel中无需新增User关联,如何链式查询指定ID的Task?
解决方案:通过User关联链查询指定Task
问题背景
现有模型关联及表结构:
- User 拥有多个Board(
boards(): HasMany) - Board 拥有多个List(
lists(): HasMany) - List 拥有多个Task(
tasks(): HasMany) - 表结构:Board含
user_id,List含board_id,Task含list_id,Task和List无user_id字段
需要实现:通过指定User ID查询其名下某条Task,且不想为User模型新增tasks()关联,希望用类似链式调用的方式实现。
正确实现方式
方法1:嵌套whereHas约束(推荐)
利用Laravel的关联存在查询,逐层关联筛选:
$user = User::find(10); $taskId = 1; $task = Task::whereHas('list.board', function ($query) use ($user) { $query->where('user_id', $user->id); })->find($taskId);
方法2:从User出发构建嵌套子查询
如果更贴近你想要的“链式”逻辑,可以通过子查询逐步缩小范围:
$user = User::find(10); $taskId = 1; $task = Task::whereIn('list_id', function ($listQuery) use ($user) { $listQuery->select('id') ->from('lists') ->whereIn('board_id', $user->boards()->select('id')); })->find($taskId);
为什么原写法失败?
你尝试的$user->boards()->lists()->tasks()->find($id)无法运行,原因是:
$user->boards()返回的是查询构建器实例,而非Board模型实例,所以它没有lists()这个关联方法- 关联方法(如
lists())是定义在模型类上的,只有模型实例或通过关联关系获取的集合才能调用,查询构建器不具备这些模型方法
内容的提问来源于stack exchange,提问作者none
相关产品推荐
相关产品推荐

