php таблицы Две модели в одном разбитом на страницы запросе с загруженными отношениями с использованием Laravel




получить данные из таблицы laravel (2)

У меня есть две модели, которые я хотел бы объединить в одну временную шкалу. Я смог сделать это, создав представление в MySQL, которое нормализует и объединяет таблицы. Я создал модель для этого представления, NewsFeed . Это хорошо работает, если я не хочу связанную модель Comment . Я приблизился к этому, переопределив метод getMorphClass в модели. Это позволяет мне получать связанные комментарии к изображениям, но не к сообщениям, потому что при getMorphClass модель не имеет никаких данных.

Я открыт для любого подхода к решению этой проблемы, а не только к тому, что я предлагаю, но я не хочу извлекать из базы данных больше данных, чем нужно.

Новостная лента

    <?php

    namespace App\Users;

    use App\Pictures\Picture;
    use App\Social\Comments\CommentableTrait;
    use App\Posts\Post;
    use App\Users\User;
    use Illuminate\Database\Eloquent\Model;

    class UserFeed extends Model
    {
        use CommentableTrait;

        public function user()
        {
            return $this->belongsTo(User::class);
        }

        public function getMorphClass(){
            if ($this->type == 'post'){
                return Post::class;
            }
            return Picture::class;
        }
    }

MySQL View

CREATE VIEW 
   `user_feeds`
AS SELECT
   `posts`.`id` AS `id`,
   `posts`.`user_id` AS `user_id`,
   'post' AS `type`,
   NULL AS `name`,
   NULL AS `thumbnail`,
   `posts`.`body` AS `body`,
   `posts`.`updated_at` AS `updated_at`,
   `posts`.`created_at` AS `created_at`
FROM 
    `posts` 
UNION SELECT
    `pictures`.`id` AS `id`,
    `pictures`.`user_id` AS `user_id`,
    'picture' AS `type`,
    `pictures`.`name` AS `name`,
    `pictures`.`thumbnail` AS `thumbnail`,
    `pictures`.`description` AS `body`,
    `pictures`.`updated_at` AS `updated_at`,
    `pictures`.`created_at` AS `created_at` 
FROM
    `pictures`;

стол для фотографий

    id
    user_id
    title
    img
    img_width
    img_height
    img_other
    description
    created_at
    updated_at

сообщений

    id
    user_id
    title
    body
    created_at
    updated_at

Хотя я не знаком ни с Laravel, ни с Eloquent в этом отношении, вот мой вклад по этому вопросу.

Предполагая, что вы получаете вывод из этого представления SQL в $Entries

Как я понимаю, Eloquent позволяет вам устанавливать значения для себя, поэтому что-то вроде этого может работать для вас (я не уверен насчет синтаксиса или использования в этом отношении).

$Collection = [];
foreach( $Entries as $Entry ) {
    if( $Entry->type === 'post' ) {
        $Collection[] = new Post($Entry->toArray())->with('comments');
    }else{
        $Collection[] = new Picture($Entry->toArray())->with('comments');
    }
}
return $Collection;

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

С помощью объекта полиморфа «FeedItem», который указывает на ваш класс Post или класс Picture, вы можете прикрепить комментарии непосредственно к FeedItem с помощью отношения hasMany.

class FeedItem extends Model {
    use CommentableTrait;
    public function feedable()
    {
        return $this->morphTo();
    }
}

class Post extends Model {
    public function feeditem()
    {
        return $this->morphOne('FeedItem', 'feedable');
    }
}

class Picture extends Model {
    public function feeditem()
    {
        return $this->morphOne('FeedItem', 'feedable');
    }
}

Это решение может потребовать некоторого рефакторинга в ваших формах, так как вам нужно будет создать запись FeedItem для каждой записи Post и записи Picture. Слушатели событий для Picture :: создал и Post :: создал должны сделать свое дело ( http://laravel.com/docs/5.1/eloquent#events ).

После настройки вы можете использовать:

FeedItem::with('comments')->orderBy('created_at','desc')->paginate(15);