Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 13.01.2017 10:52:00

Полиморфные отношения

Создал БД

posts

id - integer
title - string
body - text
videos

id - integer
title - string
url - string
comments

id - integer
body - text
commentable_id - integer
commentable_type - string

Для каждой Модели определил отношения

class Comment extends Model
{
    /**
     * Get all of the owning commentable models.
     */
    public function commentable()
    {
        return $this->morphTo();
    }
}

class Post extends Model
{
    /**
     * Get all of the post's comments.
     */
    public function comments()
    {
        return $this->morphMany('App\Comment', 'commentable');
    }
}

class Video extends Model
{
    /**
     * Get all of the video's comments.
     */
    public function comments()
    {
        return $this->morphMany('App\Comment', 'commentable');
    }
}

В контроллере написано

  public function index()
    {
        $comment = App\Comment::find(1);

        $commentable = $comment->commentable;
        dd( $commentable);
    }

Но мне выдает ошибку

FatalErrorException in Model.php line 827: Class 'post' not found

В базе пробовал менять название commentable_type на Post все равно ошибка.введите сюда описание изображения
raGZT.png
Что мне сделать чтобы отношения работали?

Не в сети

#2 13.01.2017 11:27:03

Re: Полиморфные отношения

Возможно с namespace что-то, commentable_type должен содержать App\Post, App\Video, у тебя там хранятся короткие названия, их, вроде, можно биндить.

Посмотри http://stackoverflow.com/questions/2786 … 3#27909753

Не в сети

#3 13.01.2017 11:43:41

Re: Полиморфные отношения

Да, я это не заметил в Документации.
Владельца полиморфного отношения я могу получить

$comment = App\Comment::find(1);

$commentable = $comment->commentable;

Но не работает получение всех комментариев. Он вообще почему-то составляет неправильный запрос

$post = App\Post::find(1);

foreach ($post->comments as $comment) {
    //
}

В итоге возникает ошибка

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'posts.commentable_id' in 'where clause' (SQL: select * from `posts` where `posts`.`commentable_id` = 1 and `posts`.`commentable_id` is not null and `posts`.`commentable_type` = post)

Не в сети

#4 13.01.2017 12:21:04

Re: Полиморфные отношения

В базе пробовал менять название commentable_type на Post все равно ошибка

скриншот всё объясняет. в _type сохраняется имя класса модели, для Post это будет App\Post конечно. создай связь один раз в пхп-коде (например через php artisan tinker) и сразу увидишь как оно работает. от класса модели просто берётся ::class а он содержит полностью квалифицированное имя начиная с корневого неймспейса

Не в сети

#5 13.01.2017 13:09:50

Re: Полиморфные отношения

Все разобрался, всем спасибо

Не в сети

Подвал раздела