php 将多个数据透视表结果作为1个数据集

p1iqtdky  于 2023-02-03  发布在  PHP
关注(0)|答案(1)|浏览(181)

在我的laravel应用程序中有以下数据结构

user_comments
    id - integer
    name - string
    created_at - timestamp
 
user_actions
    id - integer
    name - string
    created_at - timestamp
 
users
    id - integer
    name - string
 
user_history
    user_id - integer
    history_id - integer
    history_type - string

我的App\Models\User包含以下关系

/**
     * Get all of the comments that are associated with this user.
     */
    public function comments() : BelongsToMany {
        return $this->belongsToMany(UserComment::class, 'user_history', 'user_id', 'history_id')->where('user_history.history_type', 'comment');
    }

    /**
     * Get all of the actions that are associated with this user.
     */
    public function actions() : BelongsToMany {
        return $this->belongsToMany(UserAction::class, 'user_history', 'user_id', 'history_id')->where('user_history.history_type', 'action');
    }

我的目标是能够在需要时单独获取每种历史类型,但随后能够将所有用户历史记录放在一起,作为用户所做的所有事情的组合历史轨迹,以便我可以循环并打印出历史日志。
目前,我能想到的唯一方法是获取每个关系,合并集合,并按created_atDESC排序,这工作得很好,但在理想情况下,我希望创建一个关系(可能是多态的?),将actionscomments透视表作为一个大集合。
据我所知,我不能在数据库中UNION,因为表有不同的列数(我需要每个表中的所有数据)。
有没有一种方法可以巧妙地使用关系来让数据库做跑腿的工作,而不是必须分别获得关系并对它们进行合并/排序?
今后将有更多的枢轴关系,如user_photosuser_emails等,所以一个整洁的方式来获得他们都将是完美的!

tkclm6bt

tkclm6bt1#

无论何时需要与透视表交互,都可以创建一个透视模型并将其用作普通模型,或者可以编写一个DB语句来获取数据。

class UserHistory extends Pivot
{
   // since Pivot extends Model
   // this just a normal model
   // with Pivot specific stuff.
}

DB语句可以是这样的:

DB::select('select * from user_history');

相关问题