用户订阅频道时获取真或假的范围

时间:2018-03-08 09:47:33

标签: laravel laravel-5 eloquent laravel-5.5

我有三张桌子:

用户(id,name)

频道(id,name)

订阅(user_id,channel_id)

现在我尝试为Channel-Model实现一个范围。在此范围内,我传递了用户的ID。

作为输出,我想得到这样的东西:

列:频道ID - 频道名称 - 已订阅(真/假)

一种方法是这样的:

$query->selectSub(function($q) use ($userId) {
  $q->select(DB::raw('1'));
}, 'subscribed');

2 个答案:

答案 0 :(得分:1)

范围的预期目的是为查询添加约束,而不是添加列 因此,例如,仅获取活动通道。

您可以将应用更改为使用单独的查询:

$userChannels = User::find($userId)->channels;
$channels = Channel::all();
foreach($channels as $channel) {
    $channel->subscribed = $userChannels->contains($channel);
}

这需要BelongsToMany关系UserChannel

class User extends Model {
    public function channels() {
        return $this->belongsToMany(Channel:class, 'subscription');
    }
}

答案 1 :(得分:0)

使用此代码解决了这个问题:

$query->selectSub(function($q) use ($userId) {
  $q->from('subscriptions');
  $q->whereRaw('subscriptions.spot_id = channels.id');
  $q->select(DB::raw('IF(COUNT(1) > 0, true, false)'));
}, 'subscribed');

目前我把这些东西放到了Channel模型的范围内。还有更好的地方吗?