雄辩的ORM渴望加载多对多关系中的独特记录

kJa*_*esy 4 laravel eloquent laravel-4

背景

我有一个列表模型属于并有许多订阅者.当然还有一个属于并拥有许多List的订阅者.

问题

我想从多个列表中急切加载所有订阅者.但是,我只对不同的订阅者感兴趣,因为订阅者可以拥有并且确实属于多个列表.

我的尝试

我使用过这种distinct()方法,但这并没有产生任何乐趣.我也可以遍历结果集来手动切出重复项.只是想知道是否有办法让Laravel为我做肮脏的工作?

    $lists = Input::get('listsarray');

    $addresses = Addressbook::with(array('subscribers' => function($query)
                    {
                        $query->where('active', '=', 1);
                        // $query->distinct(); //This didn't work
                    }))->whereIn('id', $lists)->get();
Run Code Online (Sandbox Code Playgroud)

vFr*_*sop 5

通过加入检索唯一订阅者

我会尽力用Lists而不是解释它Adressbook,因为我无法真正理解你的模型,这可能会引起进一步的混乱.

如果我正确理解了您的评论,那么您正在尝试检索与列表相关联的所有唯一订阅者id IN listarray.在这种情况下,Eager Loading不是正确的方法.预先加载用于预加载模型的关联,以便稍后使用它们.在你的情况下,你不是检索Lists和他们自己Subscribers,而是Subscribers自己的独特.

$lists = Input::get('listsarray');

$subscribers = Subscriber::join('list_subscriber', 'list_subscriber.subscriber_id', '=', 'subscribers.id')
    ->whereIn('list_subscriber.list_id', $lists)
    ->groupBy('list_subscriber.subscriber_id')
    ->get(array('subscribers.*'));
Run Code Online (Sandbox Code Playgroud)

如果您还希望检索与此类订阅者关联的所有列表,您可以这样做:

// Simply include a with('lists') and Eloquent will eager load them
$subscribers = Subscriber::with('lists')
    ->join('list_subscriber', 'list_subscriber.subscriber_id', '=', 'subscribers.id')
    ->whereIn('list_subscriber.list_id', $lists)
    ->groupBy('list_subscriber.subscriber_id')
    ->get(array('subscribers.*'));
Run Code Online (Sandbox Code Playgroud)

渴望加载

如果只是改善性能,你不需要使用不同的,Laravel已经做到了.Eloquent的行为如下:

  1. 取了所有lists.
  2. 通过lists构建一个独特的数组来迭代list_ids
  3. 获取全部list_subscribers使用WHERE list_id IN (X, Y, Z)
  4. 通过所有list_subscribers建筑物迭代一系列独特的subscriber_id
  5. 获取全部subscribers使用WHERE id IN (X, Y, Z)