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

2ul0zpep  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(268)

我想我在这里遗漏了一些明显的东西,但是我想定义一个从表1到表2的单向一对一关系,例如表1模式:

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-离链接再远一点,上面写着
雄辩根据模型名称确定关系的外键。在这种情况下,手机型号会自动假定有一个用户id外键。
把这个例子应用到我的代码中,问题是我不想在我的表2中定义一个table1\u id-但是从文档中的引用听起来我需要,从table1中找到table2记录。。。?
c、 )在迁移过程中,这行中是否有任何点: $table->foreign('table2_id')->references('id')->on('table2')->onDelete('cascade'); 实际上,使用雄辩的语言(我想用正确的方式来做事情),或者我只是简单地手动设置上面的问题b)中的table2?
注意:我不想定义关系的倒数,因为我不需要从表2记录中找到表1记录。
谢谢你的帮助。

kxxlusnw

kxxlusnw1#

雄辩中的关系只在它们被定义的方向上起作用。如果你想找到 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 . 如果不想这样做,只需在更新列时手动更新列即可。
请记住,这一切都是由雄辩的。仅仅因为手动定义列值而不是使用关系助手方法并不意味着做的事情无效或不正确。
在迁移过程中,[外键]行中有任何点吗
这在数据库软件本身中创建了一个外键约束,与雄辩无关。如果定义了外键,雄辩者不会使用或关心。不过,使用外键也有好处,建议您进一步研究,以确定它们是否适合您的应用程序。

相关问题