Невозможно использовать ownToMany для синхронизации сводных данных

У меня есть сводная таблица invite_riskarea_riskfield, которая определяет связь с таблицей invite:

Невозможно использовать ownToMany для синхронизации сводных данных

Что мне нужно сделать, так это синхронизировать несколько разрешений invite_riskarea_riskfield (вставка, редактирование, просмотр). Поэтому я попытался установить следующие отношения в модели Invite:

public function permissions()
{
    return $this->belongsToMany(
        InviteRiskareaRiskfield::class,
        'invites',
        'id',
        'id'
    );
}

Так что я должен быть в состоянии сделать $invite->permissions()->sync($permissions);

Но отношение возвращает эту ошибку:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'invite_riskarea_riskfield.id' in 'on clause' (SQL: select invite_riskarea_riskfield.*, invites.id as pivot_id from invite_riskarea_riskfield inner join invites on invite_riskarea_riskfield.id = invites.id where invites.id = 17)

Что я сделал не так?

"Что я сделал не так?" — вы указали 'id' как первичный ключ, так и внешний ключ (3-й и 4-й аргументы) belongsToMany(); один из них, вероятно, должен быть 'invite_id'. Я не помню какой, но у вашего invite_riskarea_riskfield нет столбца id.
Tim Lewis 17.03.2022 18:08

А модель InviteRiskareaRiskfield кажется опорной, поэтому само определение неверно.

IGP 17.03.2022 18:26

@IGP, какие отношения вы предлагаете для синхронизации списка invite_riskarea_riskfield с методом sync?

sfarzoso 17.03.2022 18:33

синхронизация доступна только для отношений «принадлежит ко многим», поэтому вам потребуется отношение между «invite» <-> «riskarea_riskfield» (используя «invite_riskarea_riskfield» в качестве сводной точки).

IGP 17.03.2022 18:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
4
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая, что ваши модели:

  • Invite (invites таблица)
  • RiskAreaRiskField (riskarea_riskfield таблица)
  • InviteRiskareaRiskfield (invite_riskarea_riskfield таблица).

Ваши отношения должны быть следующими. Не стесняйтесь менять имена методов на что-то более понятное для вас.

class Invite extends Model
{
    public function invite_riskarea_riskfield()
    {
        return $this->hasMany(InviteRiskAreaRiskField::class, 'invite_id');
    }

    public function riskarea_riskfield()
    {
        return $this->belongsToMany(RiskAreaRiskField::class, 'invite_riskarea_riskfield', 'invite_id', 'riskarea_riskfield_id')
                    ->withPivot(['insert', 'edit', 'view'])
                    ->using(InviteRiskAreaRiskField::class);
    }
}
class RiskAreaRiskField extends Model
{
    public function invite_riskarea_riskfield()
    {
        return $this->hasMany(InviteRiskAreaRiskField::class, 'riskarea_riskfield_id');
    }

    public function invite()
    {
        return $this->belongsToMany(Invite::class, 'invite_riskarea_riskfield', 'riskarea_riskfield_id', 'invite_id')
                    ->withPivot(['insert', 'edit', 'view'])
                    ->using(InviteRiskAreaRiskField::class);
    }
}
use Illuminate\Database\Eloquent\Relations\Pivot;

class InviteRiskareaRiskfield extends Pivot
{
    public function invite()
    {
        return $this->belongsTo(Invite::class, 'invite_id');
    }

    public function riskarea_riskfield()
    {
        return $this->belongsTo(RiskAreaRiskField::class, 'riskarea_riskfield_id');
    }
}
$invite = Invite::find(/* some id */);

// sync with riskarea_riskfield id 1, 2 and 3
$invite->riskarea_riskfield() // the belongsToMany relationship
    ->sync([
        1, // default values for insert, edit, view
        2 => ['insert' => 432, 'edit' => 13, 'view' => 542],
        3 => ['insert' => 654, 'edit' => 777, 'view' => 222]
    ]);


// sync with riskarea_riskfield id 4, 5 and 6 with the same permissions
$invite->riskarea_riskfield() // the belongsToMany relationship
    ->syncWithPivotValues(
        [4, 5, 6],
        ['insert' => 654, 'edit' => 777, 'view' => 222]
    );

если у вас есть свободное время, не могли бы вы взглянуть на этот stackoverflow.com/questions/71518270/…

sfarzoso 17.03.2022 20:52

Другие вопросы по теме