在laravel 5中急切加载时,约束不会生效

时间:2015-12-22 10:42:53

标签: php laravel laravel-5 eloquent laravel-5.1

我有这个功能来获得加入关系的结果。但是,这些限制似乎并没有生效。如果我注释掉约束,它仍然会提供与未注释约束相同的结果集。

public function singleCategory($type, $category)
{
    $track = TrackType::with(['tracks.subgenres'], function($query, $category) {
        $query->where('name','=', $category);
    })->where('name', '=', $type)->get();

    dd($track->toArray());
}

任何帮助都会非常感激:)

1 个答案:

答案 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());
}

编辑2

听起来你的目标结果集实际上是轨道,而不是轨道类型。如果是这样,您可能希望首先查询曲目,然后从那里添加过滤条件(我不知道您的确切模型和关系名称,因此请相应调整):

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;获得轨道类型,但前提是它有特定子类型的轨道;另外,只在那个子类型中加载那些曲目"。