如何在Laravel中定义单向一对一关系(5.4)Eloquent?

时间:2018-05-07 20:06:26

标签: php mysql laravel laravel-5 eloquent

认为我在这里遗漏了一些明显的东西,但我想要定义从table_1到table_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');
    }

问题:

a。)记录中的关系是否必须能够从table1记录中查找相关的table2记录?

b。)如何在我的代码中设置关系?目前我的控制器代码是:

$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根据此确定关系的外键   型号名称。在这种情况下,将自动假设Phone模型   有一个user_id外键。

将该示例应用于我的代码,问题是我不想在我的Table_2中定义table1_id - 但是从我需要的文档中引用该声明,从table1中查找table2记录。 ?

c。)迁移中的这一行是否有任何意义:$table->foreign('table2_id')->references('id')->on('table2')->onDelete('cascade');并且确实使用了Eloquent(我想以正确的Laravel方式做事),或者我只是简单地手动设置table2_id,如同问题b。)上面?

注意:我不想定义关系的反转,因为我不需要从table_2记录中找到table_1记录。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

Eloquent中的关系仅适用于定义它们的方向。如果您希望能够根据Table2中定义的外键找到Table1,则只会向Table1模型添加关系。您不需要在两个模型上定义关系以便朝一个方向发展。

鉴于您的table1架构,您实际上正在使用一对一关系的table1被视为table2的孩子。你的关系看起来像这样:

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

至于设置关系,我的建议是在创建初始记录时手动应用来自table2的ID:

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

如果您要更新Table1记录,则可以使用associate()More info on that here in the docs.请注意,这确实需要您在Table2上定义关系的另一面。如果您不想这样做,只需在更新时手动更新列。

请记住,所有这些都是由Eloquent提供的。仅仅因为您手动定义列值而不是使用关系助手方法并不意味着您正在做无效或不正确的事情。

  

迁移中的[外键]行是否有任何意义

这在数据库软件本身中创建了一个外键约束,与Eloquent无关。如果您定义了外键,则Eloquent不会使用或关注。但是,使用外键有一些好处,并建议您进一步研究它以确定它们是否适合您的应用程序。