Laravel и Mysql три таблицы отношений - PullRequest
0 голосов
/ 27 июня 2018

Мне нужно добавить три таблицы в MySql, но я не знаю, как их организовать.

Мои таблицы:

  • квартира
  • пол
  • поверхность

И мои отношения:

  • квартира может иметь много этажей
  • квартира может иметь много поверхностей
  • этаж может иметь много квартир
  • пол может иметь много поверхностей
  • поверхности могут иметь один этаж (внутри этажей квартиры)
  • поверхности могут иметь одну квартиру

Поверхности вводятся после квартиры, поэтому я не могу использовать напольные покрытия в качестве пола моей квартиры.

На данный момент у меня есть стол в квартире и стол на полу с поворотным столом (многие ко многим).

В Mysql, как лучше всего справиться с этим? А после того, как внутри Laravel?

Спасибо за помощь!

Редактировать: моя работа на Laravel до сих пор (только стол и стол в квартире)

In Apartment.php:

public function floors(){
    return $this->belongsToMany('App\Models\Copro\Floor');
}

In Floor.php:

public function apartments()
{
    return $this->belongsToMany('App\Models\Copro\Apartment');
}

Редактировать 2: моя миграция до сих пор:

    Schema::create('surfaces', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('apartment_id')->unsigned()->index();
        $table->foreign('apartment_id')->references('id')->on('apartments')->onDelete('cascade');
        $table->integer('floor_id')->unsigned()->index();
        $table->foreign('floor_id')->references('id')->on('floors')->onDelete('cascade');
        $table->decimal('surface',65, 3);
    });

   Schema::create('apartments', function (Blueprint $table) {
        $table->increments('id');
        $table->string('nom');
    });

   Schema::create('floors', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('nom');
    });

    Schema::create('apartment_floor', function(Blueprint $table){
        $table->increments('id');
        $table->integer('apartment_id')->unsigned()->index();
        $table->integer('floor_id')->unsigned()->index();
        $table->foreign('apartment_id')->references('id')->on('apartments')->onDelete('cascade');
        $table->foreign('floor_id')->references('id')->on('floors')->onDelete('cascade');
    });

1 Ответ

0 голосов
/ 27 июня 2018

Я могу подумать о нижеследующих типах отношений в Laravel, хотя я не создал пример кода, хотя это должно помочь.

Модель квартиры:

public function floors() {
    return $this->belongsTo('App\Models\Copro\Floor', 'floor_id', 'id');
} /* Many apartments belong to single floor. Single floor can have many apartments.*/

public function surfaces() {
    return $this->hasMany('App\Models\Copro\Surface', 'surface_id', 'id');
} /* Single apartment has many surfaces */

Напольная модель:

public function apartments() {
    return $this->hasMany('App\Models\Copro\Apartment', 'apartment_id', 'id');
} /* A floor has many apartments */

public function surfaces() {
    return $this->hasMany('App\Models\Copro\Surface', 'surface_id', 'id');
} /* A floor has many surfaces */

Модель поверхности:

public function floor() {
    return $this->belongsTo('App\Models\Copro\Floor', 'floor_id', 'id');
} /* Surfaces belong to single floor */

public function apartment() {
    return $this->hasMany('App\Models\Copro\Apartment', 'apartment_id', 'id');
} /* Surfaces belong to single apartment */

Однако , это даст больше ясности в ответах, если вы сможете предоставить схему таблиц или схему миграции по одному и тому же вопросу. Также вы можете указать, какие SQL-запросы вы ожидаете и хотите выполнить. Благодарю. Надеюсь, это поможет.

EDIT:

У меня сейчас не установлен PHP, но приведенная ниже схема может быть полезна для нас, чтобы хотя бы дать новые и лучшие мысли.

Floor:
    id
    flr_number

Apartment:
    id
    apt_number
    flr_id

Surface:
    id
    apt_id
    surface

Этаж будет иметь много квартир сквозь поверхности . Поэтому мы можем ввести ниже метод в модели пола.

public function surfaces() {
    return $this->hasManyThrough(
        'App\Models\Copro\Surface',
        'App\Models\Copro\Apartment',
        'flr_id', /* Foreign key of Apartments table */
        'apt_id', /* Foreign key of Surfaces table */
        'id', /* Local key of Floors table */
        'id' /* Local key of Apartments table */
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...