雄辩:定义模型和迁移中的关系之间的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了雄辩:定义模型和迁移中的关系之间的区别相关的知识,希望对你有一定的参考价值。

在两个模型中定义两个表之间的关系并在正确的迁移文件中定义它之间有什么区别?

例如,我想要表cars和表persons之间的多对一关系。

选项1:我在模型中定义关系

模范人物:

class Person extends Model
{
    public function cars()
    {
        return $this->hasMany('AppCar');
    }
}

模型车:

class Car extends Model
{
    public function persons()
    {
        return $this->belongsToMany('AppPerson');
    }
}

选项2:我在迁移中定义关系

class CreateCarsTable extends Migration
{
    public function up()
    {
        Schema::create('cars', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('person_id')->references('id')->on('person');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('cars');
    }
}

谢谢您的帮助。

答案

来自docs

Eloquent关系被定义为您的Eloquent模型类的方法。因为,与Eloquent模型本身一样,关系也可以作为强大的查询构建器,定义关系作为方法提供强大的方法链接和查询功能

您提到的有关迁移的内容是:

1.FOREIGN KEYS只是确保您的数据一致。

  1. 如果我们将删除级联应用于外键定义,则当父行将删除时,引用行将自动删除。
  2. 如果我们将Update Cascade应用于外键定义,则当父行将更新时,Child行将自动更新
另一答案

这不是一回事。

hasOne()hasMany()belongsToOne()belongsToMany()函数只是返回SQL查询结果的查询构建器。

例如,cars()模型的Person方法与id在您的示例中为1,返回查询SELECT * FROM cars WHERE person_id=1的结果。

但是,外键与SQL脚本中的目的相同,以创建cars表。例如:

CREATE TABLE cars (
    ...
    person_id INT REFRENCES person(id),
    ...
);

以上是关于雄辩:定义模型和迁移中的关系之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 雄辩与查询构建器的优缺点

Laravel 5.6 |雄辩的一对多关系

两个多对多相关表之间的Laravel雄辩关系

雄辩的关系和数据库约束?

与模型属性的 where 条件的雄辩关系

一个查询中的雄辩模型关系