我确定我在这里遗漏了一些简单的东西,但我完全不知所措,因此我们将不胜感激。
我有两个模型,“用户”和“帐户”,与“模型”频道有很多关系。帐户可以与多个渠道关联,用户也可以与多个渠道关联。创建该帐户是为了使用户只能访问与他们也关联的渠道关联的帐户。
为了进行过滤,我将全局范围应用于帐户模型,因此在执行查询时,它仅返回与用户关联的渠道相关的帐户。除了新创建的帐户外,这一切都可以正常使用。
如果我在新创建的帐户上调用$ 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);
}
}
答案 0 :(得分:1)
列值不能等于数组。您正在范围内建立一系列渠道,然后检查等效性:
$q->where('channels.id','=', $channels);
也许,您想要在哪里:
$q->whereIn('channels.id', $channels);