Eloquent http://laravel.com/docs/4.2/eloquent指南包含以下内容: -
Eager Load Constraints
有时您可能希望加载关系,但也要为急切加载指定条件。这是一个例子:
$users = User::with(array('posts' => function($query)
{
$query->where('title', 'like', '%first%');
}))->get();
在这个例子中,我们渴望加载用户的帖子,但前提是帖子的标题栏中包含单词“first”。
如何解决此问题,以便您只获得帖子中标题栏包含“first”字样的用户?
换句话说,我只想拥有包含单词“first”的帖子的用户,并且我想热切地加载这些帖子。如果有10个用户,其中3个用户有一个包含单词“first”的帖子,那么我的get()将只返回3个用户,每个用户都有他们热切的帖子,其标题包含“first”。
答案 0 :(得分:1)
我相信你正在寻找这样的东西(未经测试):
$first = 'first';
$users = User::whereHas('posts' => function($q) use ($first)
{
$q->where('title', 'like', "%{$first}%");
})->with(['posts' => function($q) use ($first)
{
$q->where('title', 'like', "%{$first}%");
}])->get();
答案 1 :(得分:1)
只是为了展示上面Ciccio答案的最终语法。
users = User::whereHas('posts', function($q) use ($first)
{
$q->where('title', 'like', "%{$first}%");
})->with(array('posts' => function($q) use ($first) {
$q->where('title', 'like', "%{$first}%");
}
))->get();
就像一张纸条,当我第一次跑这个时,我的时间是30秒。我的帖子"表有30,000行,不是很大,但足以减慢一切。为"帖子添加额外的索引"表将时间缩短到0.2秒。