Laravel Eloquent。相同的关系,不同类型的回报

时间:2017-10-11 08:58:47

标签: php laravel

我认为两种雄辩的关系基本上没有区别,但工作方式不同......我找不到我错过的东西..

有三个模型*.test.com *.hello.com ConceptAttribute。这些模型有自己的MySQL表Statusconceptsattributes

  1. 概念表

    • id:integer(10)unsigned primary
    • name,description,..:string(various)nullable
  2. 属性表

    • id:integer(10)unsigned primary
    • concept_id:在concepts.id
    • 上的整数(10)unsigned foreign
  3. 状态表

    • id:integer(10)unsigned primary
    • parent_id:在concepts.id
    • 上的整数(10)unsigned foreign
  4. 为了定义雄辩的关系,我按如下方式排序。

    • statuses有很多Concept
    • Attribute有很多Concept

    很自然地,我在每个模型上双向编写每个关系。

    内部模型Status文件..

    Concept.php

    public function attributes() { return $this->hasMany('App\Attribute'); } public function statuses() { return $this->hasMany('App\Status'); } 文件内..

    Attribute.php

    public function concept() { return $this->belongsTo('App\Concept'); } 文件内..

    Status.php

    使用方法public function parent() { return $this->belongsTo('App\Concept'); } 时会出现问题。

    $concept->attributes档案..

    Concept.php

    据我所知,当执行第一个public function inherit() { // Copy basic concept data. (name, description, etc.) $children = $this->replicate(); $children->name .= ' (Inherited)'; $children->inherit_parent_id = $this->id; $children->inherit_origin_id = $this->inherit_origin_id ?? $this->id; $children->save(); // Inherit Statuses foreach( $this->statuses as $status ) { $status->inheritTo( $children ); }; // Inherit Attributes foreach( $this->attributes as $attribute ) { $attribute->inheritTo( $children ); }; return $children; } 时,foreach会返回$this->statuses个对象。但是,在第二个Collection块上,foreach返回$this->attributes个对象。所以我尝试Concept然后就可以了。

    为什么这两个$this->attributes()->get()块的工作方式不同?

2 个答案:

答案 0 :(得分:3)

$this->attributesModel类的继承属性。所以它显示了这些关系。

如果您重命名函数以引用该关系,那么它应该适合您。

内部模型Concept.php文件(只是一个示例名称)

public function rel_attributes()
{
    return $this->hasMany('App\Attribute');
}

你指的是这样的关系:

// Inherit Attributes
foreach( $this->rel_attributes as $attribute ) {
    $attribute->inheritTo( $children );
};

答案 1 :(得分:1)

我同意菲利普的回答。您需要始终以雄辩的方式定义不会覆盖默认变量的关系。