2015-10-17 1 views
3

У меня есть таблица комментариев, в которой есть комментарии к статьям, рецептам и продуктам. Поэтому его отношение polymorphic. У меня два столбца rel_id and rel_type в моей таблице комментариев, которые используются для этого отношения.Получить данные из полиморфных отношений с пространствами имен

Теперь в моем Comment.php я следующее соотношении

public function rel() 
{ 
    $this->morphTo(); 
} 

И в моих всех классах я следующий

public function comments() 
{ 
    return $this->morphMany('App\Models\Comment', 'rel'); 
} 

Когда я пытаюсь получить владелец комментария и все связанные с ним данные, которые я нашел класс не найден. Например

$comments = Comment::find(1); 
echo $comments->rel_type //article 

Теперь, если я хочу, чтобы получить данные статьи и когда я пытаюсь

$comments->rel 

Я нашел article class not found. Я использую пространство имен App\Models\Article Я искал его, я нашел ответ here. Когда я пытаюсь принять ответ, ничего не происходит, ошибка остается такой же. Когда я пытаюсь второй ответ тот же вопрос, я нашел

Relationship method must return an object of type Illuminate\Database\Eloquent\Relations\Relation 

Моя конечная цель состоит в том, чтобы получить комментарий владельца данных как $ comments->> идентификатор статей, в том и так далее. Пожалуйста, объясните, как я могу это сделать?

+0

, пожалуйста, разместите свой макет базы данных – Luceos

ответ

1

У меня в блоге об этом:

http://andrew.cool/blog/61/Morph-relationships-with-namespaces

Есть несколько вещей, которые нужно сделать. Во-первых, для всех ваших моделей, которые имеют комментарии, добавьте переменную $morphClass к классу, например .:

class Photo { 
    protected $morphClass = 'photo'; 
} 
class Album { 
    protected $morphClass = 'album'; 
} 

Во-вторых, на классе комментарий, определить массив под названием $rel_types вашего класса Comment. Это будет в основном обратным тому, что вы только что сделали, это сопоставление от короткого имени до полного имени класса.

class Comment { 
    protected $rel_types = [ 
     'album' => \App\Album::class, 
     'photo' => \App\Photo::class, 
    ]; 
} 

Наконец, определим аксессора для rel_type колонны. Этот аксессор сначала извлечет столбец из базы данных («альбом», «фото» и т. Д.), А затем преобразует его в полное имя класса («\ App \ Album», «\ App \ Photo» и т. Д.)

/** 
* @param string $type short name 
* @return string full class name 
*/ 
public function getRelTypeAttribute($type) 
{ 
    if ($type === null) { 
     return null; 
    } 

    $type = strtolower($type); 
    return array_get($this->rel_types, $type, $type); 
} 

Примечание: $morphClass что-то Laravel фактически определяет, поэтому он должен быть назван, что. $rel_types можно назвать чем угодно, я просто основываю его на столбце rel_type.

Чтобы сделать это еще лучше, добавьте этот метод getRelTypeAttribute к признаку, чтобы любая модель, которая менялась, могла повторно использовать эту черту и метод.

+0

. Фактически, точка, которую я не получаю, заключается в том, что после вашего метода я получаю 'string (18)« app \ models \ article », который является строкой класса, а не объектом. Итак, скажем, '$ comment = Comment :: find (1)' имеет 'rel_type статью и rel_id 1'. поэтому теперь, как я могу получить данные статьи, такие как все атрибуты статьи из таблицы статей, которые принадлежат этому комментарию. – user1272333

+0

@ user1272333 Просто используйте '$ comment-> rel', как раньше. Проблема, с которой вы столкнулись раньше, заключалась в том, что rel_type был просто «статьей», и он попытался создать новый объект класса «статья», которого не существует. Теперь rel_type является «app \ models \ article», и он успешно создаст объект этого полного имени класса. – andrewtweber

+0

Когда я пытаюсь '$ comment-> rel', он дает мне ошибку. Метод отношений должен возвращать объект типа Illuminate \ Database \ Eloquent \ Relations \ Relation' – user1272333

Смежные вопросы