如何从递归子调用中选择某些列

时间:2016-11-03 16:41:51

标签: php laravel laravel-5 eloquent laravel-5.3

我对Eloquent很陌生,而且我遇到了一些问题。

基本上我有一张桌子,我递归地从同一张桌子里抓住孩子。

public function children() {
    return $this->hasMany(static::class, 'parent_org_id');
}

public function childrenRec()
{
    return $this->children()->with('childrenRec');
}

其中childrenRec是基于'parent_org_id'

对所有孩子的递归调用

我在静态函数中从以下方法调用它,截至目前我只想要组织组织 组织

self::select('id','name_en')->where('parent_org_id','=',0)->with('childrenRec')->get()->toArray();

抓住顶级组织(我的顶级组织 parent_org_id 为0)。

我的问题是,在递归抓取的孩子中,它不会将其限制为 id name_en

我的问题归结为: 如何从递归子调用中仅选择某些列,这是“正确”的做事方式吗?

我的返回数组看起来像这样。

array:1 [▼
  0 => array:4 [▼
    "id" => 1
    "name_en" => "Org Unit"
    "org_type" => null
    "children_rec" => array:2 [▼
      0 => array:27 [▼
        "id" => 2
        "name_en" => "My First Orgunit."
        "code" => null
        "abbreviation" => null
        "address1" => "222 Street Street"
        "address2" => null
        "city_id" => 1
        "province_id" => 14
        "postalcode" => "C161L7"
        "country_id" => 38
        "contact_name" => null
        "contact_title" => null
        "email" => "test@test.com"
        "fax" => "902-555-5555"
        "phone1" => "5125125125125"
        "phone2" => null
        "org_type_id" => 1
        "parent_org_id" => 1
        "ref_id" => 79
        "has_users" => 1
        "created_at" => "2016-11-02 18:47:55"
        "updated_at" => "2016-11-02 18:47:55"
        "org_type" => array:4 [▶]
        "children_rec" => array:1 [▶]
      ]
      1 => array:27 [▶]
    ]
  ]
]

提前致谢。

2 个答案:

答案 0 :(得分:1)

要在with()方法中访问关系查询,可以使用以关系名称作为键的数组,并使用注入了查询构建实例的close。我需要永远跟踪解决方案的一个“问题”是,您的父查询和子查询需要包含关联其关系的密钥,因为在使用定义的列分别运行两个查询之后附加关系在模型的关系。在你的情况下,它将是:

self::select('id','name_en')
    ->where('parent_org_id','=',0)
    ->with(['childrenRec' => function($query) {
        return $query->select('id', 'name_en', 'parent_org_id');
    }])
    ->get()
    ->toArray();

如果未在子查询中包含parent_org_id,则不会附加关系。

Docs

答案 1 :(得分:0)

试试这个:

public function childrenRec()
{
    return $this->children()->with(['childrenRec' => function($query){               
         $query->select('id','name_en');
    }]);
}