php 有没有一种方法可以从Laravel雄辩中的两个数据透视表中获取数据

ivqmmu1c  于 2023-08-02  发布在  PHP
关注(0)|答案(2)|浏览(100)

下一个数据库结构:

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)拉在一起吗?

8gsdolmq

8gsdolmq1#

我会在你的Friend模型上定义一个访问器:

class Friend extends Model {
  protected function engagements(): Attribute {
    return Attribute::make(
      get: fn () => $this->activities_count ?? 0 + $this->reactions_count ?? 0
    );
  }
}

字符串
然后,只要在Query中包含withCount(['activities', 'reactions']),就可以执行以下操作:
控制器代码:

$friends = Friend::withCount(['activities', 'reactions'])
->where('user_id', auth()->id())
->get();

return view('example')->with(['friends' => $friends]);


在您的视图中:

@foreach ($friends as $friend)
  {{ $friend->engagements }}
@endforeach


https://laravel.com/docs/10.x/eloquent-mutators#defining-an-accessor

kgsdhlau

kgsdhlau2#

这是老办法但对我有用。

class Friend extends Model {
  public function reactions(){
    return $this->hasMany(FriendsReaction::class);
  }

  public function activities(){
    return $this->hasMany(FriendsActivity::class);
  }

  public function getCount(){
      return count($this->reactions() + $this->activities());
  }
}

字符串
并加以利用

$friends = Friend::where('user_id', auth()->id())->first();
$friends->getCount();

相关问题