В чем разница между определением отношения между двумя таблицами в двух моделях и определением его в соответствующем файле миграции?
Например, мне нужна связь «многие к одному» между таблицей 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');
}
}
Спасибо за помощь.
@MahdiYounesi Какая разница?
От документы
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. ИНОСТРАННЫЕ КЛЮЧИ просто гарантируют, что ваши данные согласованы.
Если мы применим каскад удаления к определению внешнего ключа, ссылка на строку будет удалена автоматически, когда будет удалена родительская строка.
Если мы применим каскад обновления к определению внешнего ключа, дочерняя строка будет обновляться автоматически, когда обновится родительская строка.
Я все еще не очень хорошо вижу связь. Когда я вызываю функцию cars()
первой модели Person, она возвращает результаты запроса SELECT * FROM cars WHERE person_id=1
. Я прав?
Да, поэтому вы делаете это с помощью помощника вместо написания необработанных запросов, эта вспомогательная функция обеспечивает связь между двумя моделями, но то, что вы сказали о ссылках на внешние ключи в миграциях, не совпадает с отношениями в Laravel, которые определены в mysql предназначены только для обеспечения согласованности данных
Хорошо, спасибо, я поддержал ваш ответ, но мне все еще не очень понятно. Я напишу ответ в этой теме, и либо вы возьмете из него элементы в своем ответе, и я подтвердю ваш ответ, либо я проверю свой через 2 дня.
Это не одно и то же.
Функции 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),
...
);
Второй - это не отношение, которое называется ограничением внешнего ключа.