2017-02-11 22 views
0

У меня возникли проблемы с функцией hasMany red redquent на Laravel. В принципе, есть модель под названием Элемент, который структурирован как граф. Он состоит из id и next_id.Laravel Преобразование коллекции определенного вида объекта в другой

Я установил функцию, которая возвращает следующий элемент на графике.

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-> == ид 2

функции, которые я использую для этого случая являются:

On 'Element' Модель

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

On ' Филиал 'Модель

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

So 1 Element связан с 1 веткой, которая связана со многими ответами. Из этого, что я получаю в результате возврата $ this-> subelement-> answers(), является сборник «Ответ». То, что я действительно хотел, было сборкой «Элемента», которые являются узлами графика. Но я не могу понять, как преобразовать всю эту коллекцию. У меня есть функция, чтобы превратить один элемент из «Ответ» на «Element»

On «Ответ» Модель

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

Но я не могу понять, как превратить каждый элемент из коллекции в есть целая коллекция «Элементов».

Любые подсказки? Спасибо.

+0

не работает? 'return $ this-> subelement-> answers-> element();' Также, когда вы возвращаетесь в свой foreach, '$ value-> element() -> get()' также будет работать. – Atiqur

+0

Вы правы в отношении foreach, этот метод действительно работает. Но когда я пытаюсь вернуть 'return $ this-> subelement-> answers-> element();' он дает мне _BadMethodCallException с сообщением 'Method element does not exist._ Один из способов заставить его работать, но не так, как я предполагал, должен был вернуться за один из ответов 'return $ this-> subelement-> answer [0] -> element();'. Но я действительно хотел вернуть их всех как «Элемент». – mauriciomta

ответ

0

Создание функции в элементной модели, как этот

public function convertToElement($collection){ 

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

А потом называют как return $this->convertToElement($this->subelement->answers()->get());

+0

Хмм интересно! Вы ответили на мой вопрос, но, к сожалению, это не сработало. Я просто понял, что '$ this-> subelement-> answers()' не возвращает коллекцию. Он возвращает объект «HasMany». Причина, по которой я думал, что это была коллекция, была всякий раз, когда я использовал функцию «-> next» на tinker, она вернула мне Collection. Поэтому, когда я пытаюсь сделать то, что вы предложили, он даже не входит в цикл foreach и возвращает ошибку: «Логическое исключение с сообщением» Метод отношения должен возвращать объект типа Illuminate \ Database \ Eloquent \ Relations \ Relation''. Но, в любом случае, я попытаюсь изменить его! – mauriciomta

+0

моя ошибка, пожалуйста, используйте get(), чтобы получить результат '$ this-> subelement-> answers() -> get()' и '$ ans-> element() -> first()' – Atiqur