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

时间:2018-05-02 14:16:05

标签: laravel eloquent

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

例如,我希望表cars和表persons之间存在多对一的关系。

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

模特人:

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

模型车:

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

选项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');
    }
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

来自docs

  

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

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

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

  1. 如果我们将删除级联应用于外键定义,当父行将删除时,引用行将自动删除。

  2. 如果我们将Update Cascade应用于外键定义,当父行将更新时,子行将自动更新

答案 1 :(得分:0)

这不是一回事。

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),
    ...
);