Красноречиво: разница между определением отношений в модели и в миграции

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

Например, мне нужна связь «многие к одному» между таблицей 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');
    }
}

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

Второй - это не отношение, которое называется ограничением внешнего ключа.

Mahdi Younesi 02.05.2018 16:52

@MahdiYounesi Какая разница?

JacopoStanchi 02.05.2018 16:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
2
629
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

От документы

Eloquent relationships are defined as methods on your Eloquent model classes. Since, like Eloquent models themselves, relationships also serve as powerful query builders, defining relationships as methods provides powerful method chaining and querying capabilities

Вы упомянули о миграции:

1. ИНОСТРАННЫЕ КЛЮЧИ просто гарантируют, что ваши данные согласованы.

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

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

Я все еще не очень хорошо вижу связь. Когда я вызываю функцию cars() первой модели Person, она возвращает результаты запроса SELECT * FROM cars WHERE person_id=1. Я прав?

JacopoStanchi 02.05.2018 17:15

Да, поэтому вы делаете это с помощью помощника вместо написания необработанных запросов, эта вспомогательная функция обеспечивает связь между двумя моделями, но то, что вы сказали о ссылках на внешние ключи в миграциях, не совпадает с отношениями в Laravel, которые определены в mysql предназначены только для обеспечения согласованности данных

Mahdi Younesi 02.05.2018 17:28

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

JacopoStanchi 02.05.2018 17:43
Ответ принят как подходящий

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

Функции 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),
    ...
);

Другие вопросы по теме