у меня есть следующее
Schema::create('bursary_providers', function (Blueprint $table) {
$table->increments('id')->unsigned()->index();
$table->string('bursary_provider',64);
$table->timestamps();
});
Schema::create('bursary_provider_contacts', function (Blueprint $table) {
$table->increments('id')->unsigned()->index();
$table->integer('bursary_provider_id')->unsigned()->index();
$table->foreign('bursary_provider_id')->references('id')->on('bursary_providers')->onDelete('cascade');
$table->integer('contact_id')->unsigned()->index();
$table->foreign('contact_id')->references('id')->on('contacts')->onDelete('cascade');
$table->timestamps();
});
Schema::create('contacts', function (Blueprint $table) {
$table->increments('id')->unsigned()->index();
$table->string('contact_name', 32);
$table->timestamps();
});
1) Да, я знаю, что это не соответствует типичному соглашению, когда хранится «тип». Я делаю это, как указано выше, для ссылочной целостности.
2) Я храню его в сводной таблице с настраиваемым именем, потому что это имеет для меня больше смысла. Требования к сводной таблице Laravels заключаются в том, что она должна быть в алфавитном порядке, но давайте сохраним ее так, поскольку я хочу, чтобы имя было parent_child
Теперь, как мне настроить мою модель? Насколько я понимаю, этот случай будет morphMany (есть и другие родители, кроме bursary_providers — опущены во избежание путаницы). Поэтому я бы использовал в своей модели BursaryProvider следующее:
public function contacts() {
return $this->morphMany('App\Contact');
}
И следующее в моей модели контактов:
public function bursary_provider () {
return $this->morphTo();
}
Как изменить приведенное выше, чтобы они правильно подключались с помощью bursary_providers.id / contacts.id и сводной таблицы bursary_provider_contacts (с bursary_provider_id и contact_id)?
// Редактировать Для ясности, другой «родительский», отличный от bursary_providers (bursary_providers может иметь много контактов; bursary_administrators может иметь много контактов; контакты принадлежат одному):
Schema::create('bursary_administrators', function (Blueprint $table) {
$table->increments('id')->unsigned()->index();
$table->string('bursary_administrator',64);
$table->timestamps();
});
Schema::create('bursary_provider_contacts', function (Blueprint $table) {
$table->increments('id')->unsigned()->index();
$table->integer('bursary_administrator_id')->unsigned()->index();
$table->foreign('bursary_administrator_id')->references('id')->on('bursary_administrators')->onDelete('cascade');
$table->integer('contact_id')->unsigned()->index();
$table->foreign('contact_id')->references('id')->on('contacts')->onDelete('cascade');
$table->timestamps();
});
bursary_providers
, чтобы мы могли определить тип отношения, потому что теперь этоmany-to-many
с задействованными только этими таблицами. Кроме того, удалитеunsigned()->index()
для всехid
, потому что это первичный ключ. - person gil   schedule 09.08.2018