Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 如果用户订阅了频道,则获取true或false的范围_Laravel_Laravel 5_Eloquent_Laravel 5.5 - Fatal编程技术网

Laravel 如果用户订阅了频道,则获取true或false的范围

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

我有三张桌子:

用户(id、名称)

频道(id、名称)

订阅(用户id、频道id)

现在,我尝试为通道模型实现一个作用域。我将用户的ID传递到此范围

作为输出,我希望得到如下结果:

$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,但也许有更好的解决方案?我在回答中更新了代码。但这也不是一个优雅的解决方案。。。解决方案的唯一区别可能是性能。对于大型表,多个简单查询可能比一个带子查询的复杂查询更快。