我有三张桌子:
用户(id,name)
频道(id,name)
订阅(user_id,channel_id)
现在我尝试为Channel-Model实现一个范围。在此范围内,我传递了用户的ID。
作为输出,我想得到这样的东西:
列:频道ID - 频道名称 - 已订阅(真/假)
一种方法是这样的:
$query->selectSub(function($q) use ($userId) {
$q->select(DB::raw('1'));
}, 'subscribed');
答案 0 :(得分:1)
范围的预期目的是为查询添加约束,而不是添加列 因此,例如,仅获取活动通道。
您可以将应用更改为使用单独的查询:
$userChannels = User::find($userId)->channels;
$channels = Channel::all();
foreach($channels as $channel) {
$channel->subscribed = $userChannels->contains($channel);
}
这需要BelongsToMany
关系User
→Channel
:
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模型的范围内。还有更好的地方吗?