我可以在父母属于另一个模型的同一模型上生孩子吗?

时间:2017-09-14 14:40:48

标签: laravel laravel-5

我有一个模型,其中子模型与父母有这种关系:

public function children()
{
    return $this->hasMany(self::class, 'parent_id', 'unique_id')->orderBy('id', 'asc');
}

我的表格如下:

        $table->increments('id');
        $table->integer('project_id')->unsigned();
        $table->string('type');
        $table->unsignedBigInteger('unique_id');
        $table->bigInteger('parent_id')->unsigned()->nullable();
        $table->integer('order')->nullable();
        $table->timestamps();

        $table->unique(['unique_id', 'project_id'], 'abcd')->unsigned();

        $table->foreign('project_id')->references('id')->on('projects')->onUpdate('cascade')->onDelete('cascade');

unique_id字段仅对每个项目唯一,这就是我这样做的原因:$table->unique(['unique_id', 'project_id'], 'abcd')->unsigned();

然而,如果我有2个项目,2个属于不同项目的父母和2个属于父母的子模型,则之前定义的关系将失败。

Project 1
Project 2

Model 1
    uniqueId: 123
    projectID: 1

Model 2
    uniqueId: 1234
    parentId: 123
    projectId: 1


Model 3
    uniqueId: 123
    projectID: 2

Model 4
    uniqueId: 1234
    parentId: 123
    projectId: 2

当我加载项目1的编辑页面时,我看到模型1有两个子模型:模型2和模型3

如何定义子关系定义关系只有属于同一个项目才有效?

我试过这个

public function children()
{
    return $this->hasMany(self::class, 'parent_id', 'unique_id')->where('project_id', $this->project_id)->orderBy('id', 'asc');
}

但它失败了,我做了dump($this->project_id)并打印出null。那么project_id似乎不可用,我不能限制返回的内容?

有没有人知道如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我认为这是一个可以通过适当的规范化表格避免的问题,我个人的建议是你将parent_id和unique_id带入另一个模型,这样你就没有在parent_id中有空值的行