Eloquent Eager loading

时间:2015-07-01 12:50:23

标签: php laravel eloquent laravel-5

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”。

2 个答案:

答案 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秒。