Я уверен, что упускаю что-то простое здесь, но я в полном недоумении, поэтому любые отзывы будут с благодарностью.
У меня есть две модели, Пользователь и Учетная запись, многие из которых имеют отношение к модели Channel. Учетные записи могут быть связаны с несколькими каналами, а пользователи также могут быть связаны с несколькими каналами. Это сделано для того, чтобы пользователи могли получать доступ только к тем учетным записям, которые связаны с каналами, с которыми они также связаны.
Чтобы выполнить фильтрацию, я применил глобальную область видимости к модели учетных записей, поэтому при выполнении запроса он возвращает только учетные записи, связанные с каналами, с которыми связан пользователь. Это работает как предназначено для всего, кроме недавно созданных учетных записей.
Если я вызываю $ 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);
}
}
Вы не можете иметь значение столбца, эквивалентное массиву. Вы создаете массив каналов в своей области, а затем проверяете эквивалентность:
$q->where('channels.id','=', $channels);
Возможно, вы хотите, где:
$q->whereIn('channels.id', $channels);
Других решений пока нет …