Php 在laravel 5中加载时,“约束”不生效

Php 在laravel 5中加载时,“约束”不生效,php,laravel,laravel-5,eloquent,laravel-5.1,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); })

我有这个函数来获取加入关系的结果。然而,这些限制似乎没有发挥作用。如果我注释掉这些约束,它仍然会给出与未注释约束相同的结果集

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

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

非常感谢您的帮助:)

约束闭包只传递了一个参数:
$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());
}
编辑 以上内容不会影响返回的轨迹类型,它只会限制加载的相关子类型。根据评论,似乎您正试图将返回的轨迹类型限制为包含特定子类型的轨迹类型。在这种情况下,您需要使用
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 听起来,目标结果集实际上是轨迹,而不是轨迹类型。如果是这样,您可能希望从查询轨迹开始,然后从那里添加筛选条件(我不知道您的确切模型和关系名称,因此需要相应地进行调整):

如果您确实希望从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());
}

第一个例子要干净得多。用通俗易懂的英语来说,第一个例子听起来像“获取某一类型和子类型的所有曲目”。第二个示例听起来像“获取曲目类型,但前提是它在某个子流派中有曲目;而且,仅加载该子流派中的那些曲目”。

约束闭包只传递了一个参数:
$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());
}
编辑 以上内容不会影响返回的轨迹类型,它只会限制加载的相关子类型。根据评论,似乎您正试图将返回的轨迹类型限制为包含特定子类型的轨迹类型。在这种情况下,您需要使用
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 听起来,目标结果集实际上是轨迹,而不是轨迹类型。如果是这样,您可能希望从查询轨迹开始,然后从那里添加筛选条件(我不知道您的确切模型和关系名称,因此需要相应地进行调整):

如果您确实希望从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());
}

第一个例子要干净得多。用通俗易懂的英语来说,第一个例子听起来像“获取某一类型和子类型的所有曲目”。第二个示例听起来像“获取曲目类型,但前提是它在某个子类型中有曲目;此外,仅加载该子类型中的那些曲目”。

谢谢您的提示(Y)。但是如果我注释$query->where('name','=',$category);还是给了我同样的结果集?你知道为什么吗?@SithiraMunasinghe此功能只会限制加载的子类型。它不会更改轨迹类型或加载的轨迹。你看到不同的东西了吗?是的,那是我的需要。限制急于加载的子类。由于某些原因,它甚至对您的代码片段也没有限制。它将加载所有具有轨迹类型的轨迹,忽略提供的约束。我已经设置了我的表结构,比如请向下滚动,直到找到包含['tracks.subgenres']的迁移片段,您需要['tracks.subgenres']=>并查看whereHas()@amirbar,感谢您指出语法错误。你如何使用wherehads。TrackType::whereHas(['track.subgenres'])?谢谢你的提示(Y)。但是如果我注释$query->where('name','=',$category);还是给了我同样的结果集?你知道为什么吗?@SithiraMunasinghe此功能只会限制加载的子类型。它不会更改轨迹类型或加载的轨迹。你看到不同的东西了吗?是的,那是我的需要。限制急于加载的子类。由于某些原因,它甚至对您的代码片段也没有限制。它将加载所有具有轨迹类型的轨迹,忽略提供的约束。我已经设置了我的表结构,比如请向下滚动,直到找到包含['tracks.subgenres']的迁移片段,您需要['tracks.subgenres']=>并查看whereHas()@amirbar,感谢您指出语法错误。你如何使用wherehads。TrackType::whereHas(['track.subgenres'])?