Как определить односторонние отношения один-к-одному в Laravel (5.4) Eloquent? - PullRequest
0 голосов
/ 07 мая 2018

Думаю, что я упускаю что-то очевидное здесь, но я хочу определить однозначное, однозначное отношение от таблицы_1 к таблице_2, например, схема table1:

    Schema::create('table1', function (Blueprint $table) {
        // Some field definitions
        $table->integer('table2_id')->unsigned();
        $table->foreign('table2_id')->references('id')->on('table2')->onDelete('cascade');
    });

В Таблице 2 ничего не известно о Таблице 1, поэтому просто определена группа полей. Модель для Таблицы 1 имеет:

public function table2() // Get table2 record
    {
        return $this->hasOne('App\Table2');
    }

Вопросы:

а.) Нужно ли это отношение в записи, чтобы иметь возможность искать соответствующую запись таблицы 2 из записи таблицы 1?

б.) Как мне установить отношения в моем коде? В настоящее время мой код контроллера:

$table_1_record = new Table1();
// What code here to define the relationship, using Eloquent? Or do I just do:
$table_1_record->table2_id = my_table2_record->id;
// But this just sets it manually doesn't it, rather than using Eloquent?

То, что меня смущает, находится здесь: https://laravel.com/docs/5.6/eloquent-relationships#one-to-one немного дальше от ссылки, где написано

Eloquent определяет внешний ключ отношения на основе название модели. В этом случае модель телефона автоматически считается есть внешний ключ user_id.

Применяя этот пример к моему коду, я не хочу определять table1_id в моем Table_2 - но звучит из этой цитаты из документов, которые мне нужны, чтобы найти запись table2 из table1 .. .

c.) Есть ли смысл в этой строке в миграции: $table->foreign('table2_id')->references('id')->on('table2')->onDelete('cascade'); и вообще использовать Eloquent (я хочу сделать все правильно Laravel), или мне просто нужно вручную установить table2_id, как в вопросе b .) выше?

Примечание: я не хочу определять обратную связь, поскольку мне не нужно находить запись table_1 из записи table_2.

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

1 Ответ

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

Отношения в Eloquent работают только в тех направлениях, в которых они определены. Если вы хотите, чтобы можно было найти Table2 на основе внешнего ключа, определенного в Table1, вы бы добавили отношение только к модели Table1. Вам не нужно определять отношения на обеих моделях, чтобы идти в одном направлении.

Учитывая вашу table1 схему, вы фактически используете обратное отношения один-к-одному. table1 считается ребенком table2. Ваши отношения будут выглядеть так:

class Table1
{
    public function table2()
    {
        return $this->belongsTo(\App\Table2::class);
    }
}

Что касается установки отношения, я рекомендую просто применить идентификатор из table2 вручную при создании начальной записи:

`$table1->table2_id = $table2->id;`

Если вы обновляете запись Table1, вы можете использовать associate(). Более подробная информация об этом здесь, в документации. Обратите внимание, что для этого необходимо определить другую сторону отношения в Table2. Если вы не хотите этого делать, просто обновите столбец вручную при обновлении.

Имейте в виду, что все это работает на Eloquent. То, что вы определяете значение столбца вручную, а не используете вспомогательный метод отношений, не означает, что вы делаете что-то неэффективно или неправильно.

Есть ли точка в строке [внешний ключ] в миграции

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

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