Laravel Eloquent结合查询活动Feed

时间:2017-10-15 20:50:04

标签: php mysql laravel-5

您好我在Laravel中有一个应用程序,其中许多用户数据存储在多个模型的单独表中。我现在需要创建一个活动源,这意味着按日期对表中的各种数据进行排序。

为了便于说明,假设我有两个模型,CommentLike

我想要一个按日期结合的Feed。 merge()不是一个选项,因为它们可能具有相同的id

因此我可以UNION他们,但我的问题是我不知道是什么来自什么。

我喜欢的表格如下:

+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| user_id    | int(11)          | NO   |     | NULL    |                |
| asset_id   | int(11)          | NO   |     | NULL    |                |
| created_at | timestamp        | YES  |     | NULL    |                |
| updated_at | timestamp        | YES  |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+

我的评论表如下:

+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| asset_id   | int(11)          | NO   |     | NULL    |                |
| content    | longtext         | NO   |     | NULL    |                |
| user_id    | int(11)          | NO   |     | NULL    |                |
| created_at | timestamp        | YES  |     | NULL    |                |
| updated_at | timestamp        | YES  |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+

我的问题是,如果我只是将这两个查询结合起来,我只会知道它们是基于content列的存在而有所不同,这可能在另一个模型中,例如Blurb或其他

基本上,我如何在模型中获得多个查询,同时保持属于哪里,因为在我的活动Feed中我想说,10分钟前你评论过,5分钟前你喜欢等等。

由于效率低下,我不想做多个查询,我也不想将所有活动(喜欢和评论等)存储在一个表中。是否有某种别名我可以使用而不是重命名列我使用查询插入数据用于查询的目的,例如注释选择会在临时字段中添加“注释”,以便我可以像访问它一样访问它

$data->type?我可以在所有表​​中放置一个类型但是我会不必要地占用空间,显然我知道注释是注释,如果它在注释表中,那是我唯一的查询,但现在我正在重新考虑我的给定的结构我需要一个查询来跨越多个表。

2 个答案:

答案 0 :(得分:1)

执行查询时,请根据表名选择添加原始值。例如,在原始SQL中:

SELECT likes.*, '' AS content, 'like' AS type
FROM likes
WHERE likes.user_id = 1
UNION
SELECT comments.*, 'comment' AS type
FROM comments
WHERE likes.user_id = 1
ORDER BY created_at DESC

Laravel代码(未经测试)看起来像:

$activity = DB::table('comments')
    ->select("comments.*, 'comment' AS type")
    ->where('comments.user_id', $user->id)
    ->union(
        DB::table('likes')
            ->select("likes.*, '' AS content, 'like' AS type")
            ->where('likes.user_id', $user->id)
    )
    ->orderBy('created_at', 'ASC')
    ->get();

答案 1 :(得分:1)

您可以使用以下代码获取用户活动Feed。

$userId = Auth::id(); //or whatever you want.
    $activity = DB::table('comment as ac')
    ->select(DB::raw('ac.user_id , ac.asset_id , ac.comment , ac.created_at , ac.updated_at , "comment" as activity_type'))
    ->where("ac.user_id", $userId)
    ->union(
    DB::table('like as al')
    ->select(DB::raw('al.user_id , al.asset_id , NULL as comment , al.created_at , al.updated_at , "like" as activity_type'))
    ->where("al.user_id", $userId)
    )
    ->latest()
    ->get();
相关问题