Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Laravel многие ко многим

#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);

Комментариев нет:

Отправить комментарий