Красноречивый: разница между определением отношений в модели и в миграции - PullRequest
0 голосов
/ 02 мая 2018

В чем разница между определением отношения между двумя таблицами в двух моделях и определением его в соответствующем файле миграции?

Например, я хочу, чтобы между таблицей cars и таблицей persons.

было многозначное отношение.

Вариант 1: я определяю соотношение в моделях

Модель:

class Person extends Model
{
    public function cars()
    {
        return $this->hasMany('App\Car');
    }
}

Модель автомобиля:

class Car extends Model
{
    public function persons()
    {
        return $this->belongsToMany('App\Person');
    }
}

Вариант 2: я определяю отношение в миграции

class CreateCarsTable extends Migration
{
    public function up()
    {
        Schema::create('cars', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('person_id')->references('id')->on('person');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('cars');
    }
}

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Это не одно и то же.

Функции hasOne(), hasMany(), belongsToOne() и belongsToMany() являются просто построителями запросов, которые возвращают результаты запроса SQL.

Например, метод cars() модели Person с id равен 1, в вашем примере возвращает результаты запроса SELECT * FROM cars WHERE person_id=1.

Однако внешний ключ имеет ту же цель, что и в сценарии SQL для создания таблицы cars. Например:

CREATE TABLE cars (
    ...
    person_id INT REFRENCES person(id),
    ...
);
0 голосов
/ 02 мая 2018

Из документов

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

То, что вы упомянули о миграции:

1. КЛЮЧИ ИГРЫ просто убедитесь, что ваши данные согласованы.

  1. Если мы применим каскад удаления к определению внешнего ключа, ссылка на строку будет удалена автоматически при удалении родительской строки.

  2. Если применить к каскаду обновления определение внешнего ключа, дочерняя строка будет обновляться автоматически при обновлении родительской строки

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