【问题标题】:Laravel Eager Loading: Skip if relation existsLaravel Eager Loading:如果关系存在则跳过
【发布时间】:2016-04-27 17:40:24
【问题描述】:

一个用户可能有很多投票和很多场合。一个场合可以包含其中一些投票

彼得创建了三张选票。他还创造了一次获得两票的机会。彼得一共有五票。


我想获取所有选票,出于性能原因,这些选票属于某个场合。

这将加载所有投票:

$oUser->load( 'votes' );

这是我到目前为止所做的:

$aLoad = array( 'votes' => function($query) {
   $query->whereNotIn('id', json_decode(json_encode(DB::raw('select id from occasions_votes')), true));
});

我的问题

  1. 它不起作用。这仍然会获取所有选票,即使 id 存在于场合投票表中。
  2. 这看起来不会节省性能。

你会怎么解决?

我应该进行多个查询(获取所有投票 ID > 删除所有存在于场合投票中的投票 ID > 获取剩余 ID 的投票)还是有直接的方法? (Laravel 4.2)

【问题讨论】:

  • 我的问题是为什么$oUser->load( 'votes' ); 会加载所有选票?它应该只加载用户的投票,而不是用户的场合投票。听起来架构更改是有序的,并且投票应该对用户和场合是多态的。

标签: laravel laravel-4 eloquent eager-loading


【解决方案1】:

试试

App\User::with('votes')->whereHas('votes',function($query){
   $query->whereNotIn('id',DB::table('occasions_votes')->get()->lists('id')->all());
})

希望对你有帮助。

【讨论】:

  • ->lists('id') 是要走的路,不知道这种方法。但不要在->lists() 上使用->all(),因为->lists() 返回的是一个数组,而不是一个对象。
猜你喜欢
  • 2021-10-17
  • 2020-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
相关资源
最近更新 更多