应用全局范围时,Laravel 5.7不返回新记录

时间:2018-12-18 14:33:52

标签: php laravel

我确定我在这里遗漏了一些简单的东西,但我完全不知所措,因此我们将不胜感激。

我有两个模型,“用户”和“帐户”,与“模型”频道有很多关系。帐户可以与多个渠道关联,用户也可以与多个渠道关联。创建该帐户是为了使用户只能访问与他们也关联的渠道关联的帐户。

为了进行过滤,我将全局范围应用于帐户模型,因此在执行查询时,它仅返回与用户关联的渠道相关的帐户。除了新创建的帐户外,这一切都可以正常使用。

如果我在新创建的帐户上调用$ account = Account :: find($ id),它将返回null。如果删除全局范围,它将返回该帐户。

我发现解决该问题的唯一方法是,如果我同步channel_user表的数据透视表,并且仅包含一个也与该帐户相关联的通道。

感觉好像某些东西被缓存在某个地方,但是我不确定从这里去哪里。请让我知道您还需要知道什么

帐户模型:

protected static function boot()
{
    parent::boot();

    static::addGlobalScope(new ChannelScope);
}

public function channels()
{
    return $this->belongsToMany('App\Channel');
}

public function user()
{
    return $this->belongsTo('App\User');
}

用户模型:

public function accounts() {
    return $this->hasMany('App\Account');
}

public function channels(){
    return $this->belongsToMany( 'App\Channel' );
}

渠道模型:

public function accounts()
{
    return $this->belongsToMany('App\Account');
}

public function users(){
    return $this->belongsToMany('App\User');
}

渠道范围:

public function apply(Builder $builder, Model $model)
{   
    $channels_ob = Auth::user()->channels;

        $channels = array();

        foreach ($channels_ob as $channel){
            array_push($channels,$channel->id);
    }

    $builder->whereHas('channels', function ($q) use ($channels){
                $q->where('channels.id','=', $channels);});

}

AccountController.php商店:

$account->save();


    if (isset($request->chk_channels)){
        foreach($request->chk_channels as $channel){
            $ch = Channel::where('name',$channel)->get();
            $ch_array[] = $ch[0]->id;
        }

    }

    $account->channels()->sync($ch_array);

UserController.php update_channels:

public function update_channels(Request $request, $id)
{   
    $user = User::find($id);

    if ($user->hasPermission('view_all_accounts')){
        if (isset($request->chk_channels)){

        foreach($request->chk_channels as $channel){
            $ch = Channel::where('name',$channel)->get();
            $ch_array[] = $ch[0]->id;
        }

        $user->channels()->sync($ch_array);
    } 

}

1 个答案:

答案 0 :(得分:1)

列值不能等于数组。您正在范围内建立一系列渠道,然后检查等效性:

$q->where('channels.id','=', $channels);

也许,您想要在哪里:

$q->whereIn('channels.id', $channels);