Повторите FK той же таблицы Forign в миграции Laravel - PullRequest
0 голосов
/ 06 марта 2019

Склад имеет связанные с ним учетные записи следующим образом

Schema::create('warehouses', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('title', 32);

    $table->bigInteger('sales_account_id');
    $table->bigInteger('promotions_account_id');
    $table->bigInteger('damages_account_id');

    $table->string('address')->nullable();
    $table->string('phones')->nullable();
    $table->string('fax', 12)->nullable();
    $table->string('email')->nullable();

    $table->engine = 'InnoDB';
    $table->charset = 'utf8';
    $table->softDeletes();
    $table->timestamps();
});

Как можно связать аккаунты по продажам, продвижению и убыткам с таблицей Аккаунтов гладко, как методы hasOne / hasMany / ownTo ??

1 Ответ

0 голосов
/ 06 марта 2019

Предполагая, что ваш

  • sales таблица имеет первичный ключ id
  • promotion таблица имеет первичный ключ id
  • damages таблица имеет первичный ключ id

И каждый первичный ключ имеет тип unsigned bigInt, прежде всего вам нужно изменить миграцию warehouses следующим образом, чтобы добавить внешние ключи:

Schema::create('warehouses', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('title', 32);

    $table->unsignedBigInteger('sales_account_id');//note this line change
    $table->unsignedBigInteger('promotions_account_id');//note this line change
    $table->unsignedBigInteger('damages_account_id');//note this line change

    $table->string('address')->nullable();
    $table->string('phones')->nullable();
    $table->string('fax', 12)->nullable();
    $table->string('email')->nullable();

    $table->engine = 'InnoDB';
    $table->charset = 'utf8';
    $table->softDeletes();
    $table->timestamps();

    //add foreign keys
    $table->foreign('sales_account_id')->references('id')->on('sales')->onUpdate('cascade');
    $table->foreign('promotions_account_id')->references('id')->on('promotion')->onUpdate('cascade');
    $table->foreign('damages_account_id')->references('id')->on('damages')->onUpdate('cascade');
});

После того, как вы определили свои внешние ключи, вы можете связать вашу модель Warehouse с остальными тремя моделями с помощью красноречивых методов связи.

Предполагая, что отношения между:

  • склады и продажи - ОДИН ОДИН.
  • склады и рекламные акции ОДИН-ОДИН.
  • склады и повреждения один на один.

Внутри модели склада вы можете определить три метода:

public function sale()
{
   return $this->hasOne('App\Sale', 'sales_account_id');
}

public function promotion()
{
   return $this->hasOne('App\Promotion', 'promotions_account_id');
}

public function damage()
{
   return $this->hasOne('App\Damage', 'damages_account_id');
}

Это просто подсказка, чтобы дать вам представление о том, как вы можете связать модели, однако, основываясь на ваших отношениях между таблицами, методы могут отличаться.

Как только вы определили правильные отношения, вы стремитесь загрузить любое отношение следующим образом:

$warehouse = \App\Warehouse::with('sale')->get();//for example to eager load warehouses with sales

OR

вы можете загружать продажи, когда у вас есть склад, например:

$warehouse = \App\Warehouse::first();
$sale = $warehouse->sale;

Все сценарии не могут быть определены здесь, поскольку они огромны. Тем не менее, я надеюсь, что это поможет вам начать.

Следует отметить, что ваша таблица promotion должна быть определена как promotions, чтобы модель Promotion могла относиться к ней автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...