Laravel 如果用户订阅了频道,则获取true或false的范围
我有三张桌子: 用户(id、名称) 频道(id、名称) 订阅(用户id、频道id) 现在,我尝试为通道模型实现一个作用域。我将用户的ID传递到此范围 作为输出,我希望得到如下结果:Laravel 如果用户订阅了频道,则获取true或false的范围,laravel,laravel-5,eloquent,laravel-5.5,Laravel,Laravel 5,Eloquent,Laravel 5.5,我有三张桌子: 用户(id、名称) 频道(id、名称) 订阅(用户id、频道id) 现在,我尝试为通道模型实现一个作用域。我将用户的ID传递到此范围 作为输出,我希望得到如下结果: $query->selectSub(function($q) use ($userId) { $q->select(DB::raw('1')); }, 'subscribed'); 列:频道ID-频道名称-订阅(真/假) 一种方法是这样的: $query->selectSub(function
$query->selectSub(function($q) use ($userId) {
$q->select(DB::raw('1'));
}, 'subscribed');
列:频道ID-频道名称-订阅(真/假)
一种方法是这样的:
$query->selectSub(function($q) use ($userId) {
$q->select(DB::raw('1'));
}, 'subscribed');
作用域的预期用途是向查询添加约束,而不是添加列。
因此,例如,仅获取活动通道 您可以更改应用程序以处理单独的查询:
$userChannels = User::find($userId)->channels;
$channels = Channel::all();
foreach($channels as $channel) {
$channel->subscribed = $userChannels->contains($channel);
}
这需要一个归属关系用户→ <代码>频道
:
class User extends Model {
public function channels() {
return $this->belongsToMany(Channel:class, 'subscription');
}
}
用这个代码解决了这个问题:
$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');
现在我把这些东西放到了渠道模型的范围内。有更好的地方吗?好的。。。你试过什么,失败了什么?代码在哪里?如果您想看到一些代码:public function scopeWithSubscribed($query,$userId){}我建议将其添加到问题中,而不是添加到评论部分。请检查问题,我已添加。谢谢您的回答Jonas。但我不想检查用户是否通过Laravel订阅了该频道。这应该传递给json响应,因为我在这里实现了一个API。解决方法是执行->with()并仅在用户id等于请求的用户id的情况下加入订阅条目。因此,响应中有一个订阅条目数组(始终为一个)。但是,只要得到真或假就更好了……好的,用selectSub()解决它。你说过,范围不是解决这个问题的好方法。你有没有给我一个建议,把这样的东西放在哪里?非常感谢。您的响应是一个包含所有通道的数组,每个通道都应该为请求的用户提供一个布尔值subscribed
?是的,完全正确!它现在可以很好地使用scope,但也许有更好的解决方案?我在回答中更新了代码。但这也不是一个优雅的解决方案。。。解决方案的唯一区别可能是性能。对于大型表,多个简单查询可能比一个带子查询的复杂查询更快。