gpt4 book ai didi

php - 使用 Laravel 将两个模型合并为一个具有预加载关系的分页查询

转载 作者:IT老高 更新时间:2023-10-28 23:55:32 25 4
gpt4 key购买 nike

我想将两个模型合并到一个时间轴中。我已经能够通过在 mysql 中创建一个 View 来规范化和联合表来做到这一点。我为此 View 创建了一个模型,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

最佳答案

您非常接近构建 View 的想法。事实上,如果您创建一个实际的表而不是 View ,解决方案就会变得非常简单。

使用指向您的 Post 类或 Picture 类的“FeedItem”多态对象,您可以通过 hasMany 关系将评论直接附加到 FeedItem。

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 条目。 Picture::created 和 Post::created 的事件监听器应该可以解决问题(http://laravel.com/docs/5.1/eloquent#events)。

设置完成后,您可以使用:

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

关于php - 使用 Laravel 将两个模型合并为一个具有预加载关系的分页查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33354721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com