Laravel将某种实体的集合转换为另一种实体

时间:2017-02-11 23:08:44

标签: laravel eloquent laravel-5.4

我在Laravel上使用hasMany eloquent功能时遇到了麻烦。基本上,有一个名为 Element 的模型,其结构类似于图形。它由id和next_id组成。

我已经设置了一个返回图表上下一个元素的函数。

public function next() {
    if($this->element_type->id == 2) {
        return $this->subelement->answers();
    } else {
        return $this->hasOne(Element::class, 'id', 'next_id');
    }
}

每当它进入“else”语句时,它就可以正常工作。它根据Element给出了列表的下一个节点。问题是它满足条件$ this-> element_type-> id == 2

我在这种情况下使用的函数是:

关于'元素'模型

public function subelement() {
    return $this->hasOne(Branch::class);
}

在'分支'模型

public function answers() {
    return $this->hasMany(Answer::class, 'branch_id', 'id');
}

所以1个元素链接到1个分支,链接到许多答案。从那里,我得到的返回结果$ this-> subelement-> answers()是'答案'的集合。我真正想要的是一个'元素'的集合,它是图的节点。但我无法弄清楚如何改造整个系列。我有一个函数将单个元素从'Answer'转换为'Element'

关于'回答'模式

public function element() {
    return $this->belongsTo(Element::class);
}

但我无法弄清楚如何将Collection的每个元素转换为整个'Elements'集合。

任何线索?谢谢。

1 个答案:

答案 0 :(得分:1)

在Element模型中创建一个像这样的函数

public function convertToElement($collection){

    $col = [] ;
    foreach($collection as $ans){
        $col[] = $ans->element();
    }
    return collect($col);
}

然后像return $this->convertToElement($this->subelement->answers()->get());

一样打电话