Laravel5:Eloquent模型关系如何在数据库中表达?

时间:2015-05-22 04:33:08

标签: laravel eloquent

缺少一个我无法理解的链接。

我使用迁移来创建数据库表,并在那里定义关系。意思是..如果我有一个人员表和一张工作表,我需要一个人与工作之间的一对多关系,我的工作表中包含一个“person_id”。

当我播种数据或将其添加到我的应用程序中时,我会完成添加记录的所有工作,设置* _id =值等。

但不知怎的,我觉得Laravel有更好的方法。

如果我定义与oneToMany Laravel Eloquent支持的一对多关系:

在我的人物模型中.....

 public function jobs()
    {
        return $this->hasMany('Jobs);
    }

在数据库级别上做了什么?如何为此类表创建迁移? Laravel是否在这里自动完成“预期”的事情?喜欢寻找一个乔布斯表,并在那里有一个“person_id”?

2 个答案:

答案 0 :(得分:1)

确实支持在迁移蓝图中创建外键关系,这也非常简单。

以下是一个简单的示例迁移,我们定义了一个作业表,其中user_id列引用了id表上的users列。

Schema::create('jobs', function($table)
{
    $table->increments('id');
    $table->integer('user_id')->unsigned();
    $table->foreign('user_id')->references('id')->on('users');

});

您还可以使用laravel提供的其他一些方法,例如onDelete()onUpdate

当然,为了更好地了解您可以使用的选项,请阅读文档here

修改

请记住,Eloquent只是使用流畅的SQL包装器,在幕后只有原始的SQL查询,没有什么神奇的事情发生,流畅的只是让你的生活更轻松,帮助你编写可维护的代码。 看看Query Builder及其工作原理,以及@Martin Charchar所说的Eloquent and relationships

答案 1 :(得分:1)

是的,Laravel正在做你在上一段中的猜测。

来自the Laravel documentation for Eloquent Relationships(相关段落以粗体显示):

  

例如,User模型可能只有一个Phone。我们可以定义这个   Eloquent中的关系:

class User extends Model {

    public function phone()
    {
        return $this->hasOne('App\Phone');
    }

}
     

传递给hasOne方法的第一个参数是   相关模型。一旦定义了关系,我们就可以检索它   使用Eloquent的dynamic properties

$phone = User::find(1)->phone;
     

此语句执行的SQL   将如下:

select * from users where id = 1

select * from phones where user_id = 1
     

请注意,Eloquent根据模型名称假定关系的外键。在这种情况下,假定Phone模型使用user_id外键。

另请注意,您实际上不必在数据库中显式设置外键索引(只需使用与父键列具有相同数据类型的“外键”列足以使Laravel接受关系)虽然你可能为了数据库完整性而拥有这些索引。

相关问题