我有这个功能来获得加入关系的结果。但是,这些限制似乎并没有生效。如果我注释掉约束,它仍然会提供与未注释约束相同的结果集。
public function singleCategory($type, $category)
{
$track = TrackType::with(['tracks.subgenres'], function($query, $category) {
$query->where('name','=', $category);
})->where('name', '=', $type)->get();
dd($track->toArray());
}
任何帮助都会非常感激:)
答案 0 :(得分:3)
约束闭包只传递一个参数:$query
。您尝试访问的其他参数($category
)需要通过use
关键字提供:
public function singleCategory($type, $category)
{
$track = TrackType::with(['tracks.subgenres'], function($query) use ($category) {
$query->where('name', '=', $category);
})->where('name', '=', $type)->get();
dd($track->toArray());
}
以上内容不会影响返回的TrackType,它只会限制急切加载的相关子类型。根据评论,似乎您试图将TrackTypes限制为包含某个子类型的TrackTypes。在这种情况下,您需要使用whereHas
方法:
public function singleCategory($type, $category)
{
$track = TrackType::with('tracks.subgenres')
->whereHas('tracks.subgenres', function($query) use ($category) {
$query->where('name', '=', $category);
})
->where('name', '=', $type)
->get();
dd($track->toArray());
}
听起来你的目标结果集实际上是轨道,而不是轨道类型。如果是这样,您可能希望首先查询曲目,然后从那里添加过滤条件(我不知道您的确切模型和关系名称,因此请相应调整):
public function singleCategory($type, $category)
{
$track = Track::with(['tracktype', 'subgenres'])
->whereHas('tracktype', function($query) use ($type) {
$query->where('name', '=', $type);
})
->whereHas('subgenres', function($query) use ($category) {
$query->where('name', '=', $category);
})
->get();
dd($track->toArray());
}
如果您真的想要开始使用TrackType,那么除了添加whereHas()
以查找TrackType之外,您还需要添加whereHas()
来过滤需要加载的曲目:
public function singleCategory($type, $category)
{
$track = TrackType::with(['tracks' => function ($query) use ($category) {
$query->whereHas('subgenres', function($query) use ($category) {
$query->where('name', '=', $category);
});
}, 'tracks.subgenres'])
->whereHas('tracks.subgenres', function($query) use ($category) {
$query->where('name', '=', $category);
})
->where('name', '=', $type)
->get();
dd($track->toArray());
}
第一个例子更清洁。用简单的英语,第一个例子听起来像#34;得到一个类型和子类型的所有轨道"。第二个例子听起来像是#34;获得轨道类型,但前提是它有特定子类型的轨道;另外,只在那个子类型中加载那些曲目"。