使用Laravel Eloquent和hasOne()\ hasMany()关系,是否可以将“父”表限制为仅在存在“child \ foreign”关系时检索结果?
FOOS
+----+------------+
| id | etc |
+----+------------+
| 1 | one |
| 2 | two |
| 3 | three |
| 4 | four |
+----+------------+
BARS
+----+-----+--------+
| id | val | foo_id |
+----+-----+--------+
| 11 | 101 | 1 |
| 12 | 102 | 2 |
| 13 | 203 | 3 |
| 14 | 204 | 4 |
+----+-----+--------+
在Foo类(模型)
public function highBars(){
return $this->hasOne('App\Bar')->where('val','>','200');
}
控制器中的
Foo::with('highBars')->get();
返回所有FOOS,即使某些high_bars
关系为空。
是否可以仅包含关系值不为空的FOOS结果? (foos.id = 3,4)
这是检索到的......
0 => array:3 [▼
"id" => 1
"etc" => "one"
"high_bars" => null
]
1 => array:3 [▼
"id" => 2
"etc" => "two"
"high_bars" => null
]
2 => array:3 [▼
"id" => 3
"etc" => "three"
"high_bars" => array:2 [▼
"id" => 13
"val" =>203
"foo_id" =>3
]
]
3 => array:3 [▼
"id" => 4
"etc" => "four"
"high_bars" => array:2 [▼
"id" => 14
"val" =>204
"foo_id" =>4
]
]
但这就是我想要的......
0 => array:3 [▼
"id" => 3
"etc" => "three"
"high_bars" => array:2 [▼
"id" => 13
"val" =>203
"foo_id" =>3
]
]
1 => array:3 [▼
"id" => 4
"etc" => "four"
"high_bars" => array:2 [▼
"id" => 14
"val" =>204
"foo_id" =>4
]
]
答案 0 :(得分:3)
访问模型的记录时,您可能希望限制您的 结果基于存在关系。例如,想象一下 您想要检索至少有一条评论的所有博客帖子。至 这样做,您可以将关系的名称传递给has方法:
// Retrieve all posts that have at least one comment...
$posts = App\Post::has('comments')->get();
您还可以指定运算符并计算以进一步自定义 查询:
// Retrieve all posts that have three or more comments...
$posts = Post::has('comments', '>=', 3)->get();
也可以使用“点”表示法构造嵌套的语句。 例如,您可以检索至少有一条评论的所有帖子 并投票:
// Retrieve all posts that have at least one comment with votes...
$posts = Post::has('comments.votes')->get();
如果您需要更多电量,可以使用whereHas和orWhereHas 将“where”条件放在您的查询上的方法。这些方法 允许您向关系约束添加自定义约束, 例如检查评论的内容:
// Retrieve all posts with at least one comment containing words like foo%
$posts = Post::whereHas('comments', function ($query) {
$query->where('content', 'like', 'foo%');
})->get();
对于您的具体示例,这可以通过使用:
来实现Foo::has('highBars')->get();
答案 1 :(得分:0)
这还不够。当您定义关系时,您只需告诉Laravel哪些数据与实体相关联,但它并不限制数据的获取方式。
所以当你在你的控制器中时
Foo::with('highBars')->get();
这里的关键是get
。你不会把它限制在任何东西上,你只是说,把你所有的行都拿给我,除此之外,得到与这个模型相关的数据。你需要做的是添加一个约束。
Foo::with('highBars')->whereHas('highBars', function ($query) {
$query->where('val', '>', '200');
})->get();
或者它的快捷方式是
Foo::has('highBars')->get();