【问题标题】:Laravel5: How are Eloquent model relationships expressed in the database?Laravel5:Eloquent 模型关系在数据库中是如何表达的?
【发布时间】:2015-08-03 23:43:00
【问题描述】:

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

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

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

但不知何故,我觉得 Laravel 有更好的方法来做到这一点。

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

在我的 Person 模型中.....

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

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

【问题讨论】:

    标签: laravel eloquent


    【解决方案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 接受这种关系) ,尽管为了数据库的完整性,您可能应该拥有这些索引。

    【讨论】:

      【解决方案2】:

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

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

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-05
        • 1970-01-01
        • 2016-08-19
        • 2017-02-22
        • 2018-10-20
        • 2019-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多