#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);
Комментариев нет:
Отправить комментарий