【问题标题】:Can I get children on same model where parent belongs to another model?我可以让孩子在父母属于另一个模型的同一模型上吗?
【发布时间】:2018-02-23 14:35:31
【问题描述】:

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

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 个属于不同项目的父级和属于父级的两个子模型,则前面定义的关系会失败。

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) 并且打印为空。所以project_id 在那个时候似乎不可用,我不能限制返回的内容?

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

【问题讨论】:

  • 转储this会打印什么?如果您对值进行硬编码,它是否有效?
  • 是的,如果我将 parent_id 设置为 1,效果会很好,然后它会返回内容。我猜 $this->parent_id 在我打印它时为 null,因为 sql 尚未执行,然后 value 为 null
  • 你给谁装孩子?使用with 还是使用load?像这样的东西可以工作:MyModel::find(1)->load('children');

标签: laravel laravel-5


【解决方案1】:

我认为这是一个可以通过适当的规范化表避免的问题,我个人的建议是您将 parent_id 和 unique_id 放入不同的模型中,这样您就不会在 parent_id 中包含带有空值的行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多