Laravel 5.7 не возвращает новую запись, когда применяется глобальная область

Я уверен, что упускаю что-то простое здесь, но я в полном недоумении, поэтому любые отзывы будут с благодарностью.

У меня есть две модели, Пользователь и Учетная запись, многие из которых имеют отношение к модели 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);
}

}

0

Решение

Вы не можете иметь значение столбца, эквивалентное массиву. Вы создаете массив каналов в своей области, а затем проверяете эквивалентность:

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

Возможно, вы хотите, где:

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

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector