ОК, вот как я справился с этим.
Настраиваемая сводная таблица
В сводную таблицу я добавил столбец с именем type
.Вот как выглядит моя миграция сводной таблицы company_respondent
:
Schema::create('company_respondent', function (Blueprint $table) {
$table->unsignedInteger('company_id');
$table->unsignedInteger('respondent_id');
$table->string('type');
$table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
$table->foreign('respondent_id')->references('id')->on('respondents')->onDelete('cascade');
$table->primary(['company_id','respondent_id','type']);
});
Обратите внимание, что для первичного ключа я использую все три столбца.Это позволит мне объявить различные типы отношений между одной и той же парой компания-респондент, например, когда респондент выбрал компанию, которую я могу хранить selected
, и когда они оценили компанию, я могу сохранить rated
в type
column.
withPivot
Прежде чем я смогу это сделать, я должен сказать Laravel ожидать этого нового столбца в моделях Company
и Respondent
, использующих withPivot()
при определении отношения.Мне нужно сделать это с обеих сторон отношения:
//Respondent.php
use App\Company;
public function companies()
{
return $this->belongsToMany(Company::class)->withPivot('type');
}
//Company.php
use App\Respondent;
public function respondents()
{
return $this->belongsToMany(Respondent::class)->withPivot('type');
}
После этого я могу сохранить этот столбец при сохранении отношения и отфильтровать его.
Хранение:
$respondent->companies()->attach($companies_selected, ['type'=> 'selected']);
Где $companies_selected
- это либо один идентификатор, либо массив идентификаторов.
Фильтрация:
//returns an array of company names that a respondent with an id of `2` has selected.
$company_names = Respondent::find(2)
->companies()
->wherePivot('type','selected')
->pluck('name')->toArray();
Я могу просто заменить selected
, rated
, nominated
или что-либо еще, что мне нравится, для определения различных типов отношений, которые могут существовать между двумя таблицами.
Я надеюсь, что это поможет кому-то еще, или я получаю отзыв о лучшем способе сделать это.