#php #laravel #laravel5
Есть три таблицы в БД. Связь многие ко многим Модели Sample.php public function services() { return $this->belongsToMany('App\Service'); } Service.php public function samples() { return $this->belongsToMany('App\Sample'); } Если бы я хотел добавить записи в таблицу sample_service через модель Sample, то я бы написал так public function sync_services(int $sample_id, Request $request) { $sample=Sample::findOrFail($sample_id); $sample->services()->sync($request->input('service_ids', [])); return $sample->services; } Т.е. передал бы массив с идентификаторами сервисов, которые хотел бы добавить. И всё бы ничего, если бы мне не нужно было добавить повторяющиеся сервисы. Т.е. всё работает, если sync([1,2,3]), но мне нужно sync([1,2,2,3,3,3,3]). Мне важно, чтобы в таблице sample_service было именно так - без столбца quantity и т.п., поскольку каждый отдельный сервис с таблице sample_service будет иметь статусы - время закрытия, например. Далее нужно будет обновлять некоторые поля таблицы sample_service. Так что, я подозреваю, придётся, наверное, заводить третью модель SampleService class SampleService extends Model { public function Sample() { return $this->belongsTo('App\Sample'); } public function Service() { return $this->belongsTo('App\Service'); } } А в граничащих моделях добавить public function sampleService() { return $this->hasMany('App\SampleService'); } public function sampleService() { return $this->belongsToMany('App\SampleService'); } Однако при таком подходе не могу получить данные из sample_service непосредственно в tinker: $sample = App\Sample::first(); $sample->sampleService; Получаю ожидаемую ошибку - у меня нет таблицы sample_services. У меня название в единственном числе - sample_service Illuminate\Database\QueryException with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'db7.sample_services' doesn't exist (SQL: select * from sample_services where sample_services.sample_id = 1 and sample_services.sample_id is not null)' Пробую в модели Sample.php в связи указать таблицу, но это не имеет эффекта и приводит к той же ошибке. Что не так и как быть? public function sampleService() { return $this->belongsToMany('App\SampleService', 'sample_service'); } Как это сделать в laravel 5.6?
Ответы
Ответ 1
Может это то, что вам нужно: public function services() { return $this->belongsToMany( Service::class, 'sample_service' )->withPivot('quantity') ->withTimestamps(); } $sample->services()->sync([$id => $request->only(['quantity'])], false);
Комментариев нет:
Отправить комментарий