在我的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_at
DESC
排序,这工作得很好,但在理想情况下,我希望创建一个关系(可能是多态的?),将actions
和comments
透视表作为一个大集合。
据我所知,我不能在数据库中UNION
,因为表有不同的列数(我需要每个表中的所有数据)。
有没有一种方法可以巧妙地使用关系来让数据库做跑腿的工作,而不是必须分别获得关系并对它们进行合并/排序?
今后将有更多的枢轴关系,如user_photos
,user_emails
等,所以一个整洁的方式来获得他们都将是完美的!
1条答案
按热度按时间tkclm6bt1#
无论何时需要与透视表交互,都可以创建一个透视模型并将其用作普通模型,或者可以编写一个DB语句来获取数据。
DB语句可以是这样的: