Laravel 查询模型关系

Posted

技术标签:

【中文标题】Laravel 查询模型关系【英文标题】:Laravel querying model relationships 【发布时间】:2014-01-18 15:45:50 【问题描述】:

有没有办法做类似的事情?

Picture::with('gallery')->where('gallery.path', $galleryPath)->first();

它应该搜索一条记录,但查询将应用于它的关系。

【问题讨论】:

【参考方案1】:

如果您使用的是 Laravel 4.1:

$picture = Picture::whereHas('gallery', function($q) use ($galleryPath)

    $q->where('path', $galleryPath);

)->first();

Laravel 4:

$picture = Picture::with(array('gallery' => function($q) use ($galleryPath)
 
   $q->where('path', $galleryPath); 
 ))->first();

【讨论】:

对我不起作用 :( 即使 Gallery::has('pictures')->get() 返回一个空数组。【参考方案2】:

我相信你要找的是Eager Load Contraints

您可以使用函数回调例如指定关系的条件

Picture::with(array('gallery' => function($query) 
 
   $query->where('path', $galleryPath); 
 ))->get();

【讨论】:

您的查询将返回所有图片记录,并急切加载并加入路径匹配的图库记录。它应该做的是仅加载那些具有与路径匹配的画廊的图片记录。你看出区别了吗? 嗯,如果你使用的是 Laravel 4.1,你可以使用 whereHas 方法,该方法应该返回至少有一个具有指定条件的画廊的图片记录。

以上是关于Laravel 查询模型关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 模型关联建立与查询

Laravel - 模型自引用belongsToMany与其他关系和具有多个限制的查询

具有计数关系的 Laravel 查询构建器

Laravel 通过属性获得雄辩的查询构建器关系

laravel 关联查询 表一、表二、两个表的关联表

使用 Laravel 将两个模型合并到一个分页查询中,并带有急切加载的关系