下一个数据库结构:
friends:
id,
first_name,
last_name,
friends_activities:
friend_id,
user_id,
type (enum),
created_at,
friends_reactions:
friend_id,
user_id,
type (enum),
我需要把所有的friends_reactions和friends_activity加在一起,例如:engagements_count.
到目前为止,我已经在Friend.php模型中创建了雄辩的关系:
public function reactions()
{
return $this->hasMany(FriendsReaction::class);
}
public function activities()
{
return $this->hasMany(FriendsActivity::class);
}
型
现在,我让他们:
$friends = Friend::query()->withCount('activities', 'reactions')
->where('user_id', auth()->id());
switch ($request->input('status')) {
case FriendStatus::Active->value:
$friends->where('status', '!=', FriendStatus::Whitelisted)
->where('status', '!=', FriendStatus::Unfriended)
->havingRaw('activities_count + reactions_count > 0');
break;
case FriendStatus::Inactive->value:
$friends->where('status', '!=', FriendStatus::Whitelisted)
->where('status', '!=', FriendStatus::Unfriended)
->havingRaw('activities_count + reactions_count = 0');
break;
default:
$friends->where('status', $request->input('status'));
break;
}
if ($search = $request->input('search')) {
$friends->whereRaw("(CONCAT(`first_name`, ' ', `last_name`) LIKE ?)","%$search%");
}
if ($request->input('sortBy') && $request->has('sortType')) {
switch ($request->input('sortBy')) {
case 'name':
$friends->orderByRaw("CONCAT(first_name, ' ', last_name) {$request->input('sortType')}");
break;
case 'engagements_count':
$friends->orderByRaw("activities_count + reactions_count {$request->input('sortType')}");
break;
default:
$friends->orderBy($request->input('sortBy'), $request->input('sortType'));
break;
}
}
return $friends->paginate($request->input('perPage', 10));
型
你知道如何将活动和React作为engagements
(活动+React)通过雄辩的withCount(当然是eager loaded)拉在一起吗?
2条答案
按热度按时间8gsdolmq1#
我会在你的
Friend
模型上定义一个访问器:字符串
然后,只要在Query中包含
withCount(['activities', 'reactions'])
,就可以执行以下操作:控制器代码:
型
在您的视图中:
型
https://laravel.com/docs/10.x/eloquent-mutators#defining-an-accessor
kgsdhlau2#
这是老办法但对我有用。
字符串
并加以利用
型