Laravel Eloquent 中的多个嵌套查询

你的噩梦坦克

我有一个聊天应用程序,我需要使用 eloquent ORM 过滤那些在组上一条消息中有附件 [s] 的用户对话。我有以下数据库表/模型:

  • 组和用户。它们之间的关系是 NN,因此在组和用户之间有一个数据透视表,名为 group_user。虽然这个表已经扩展了一些额外的字段,但结果 group_user 现在有了它自己的模型。
  • 消息。来自组和用户的关系都是 1-N。
  • 附件。消息的关系是 1-N。

这种过滤的算法不是问题 - 获取用户(因为我需要特定的用户组)和他的组,找到所有组消息,按创建日期按降序对它们进行排序,然后取前一个。然后检查此消息在“附件”表中是否有任何记录。显然,我确实在各自的模型中定义了所有关系。现在我有这个代码,但它返回在任何消息中包含附件的所有组。此外,我需要按最后一条消息“created_at”日期对查询进行排序。

return $user->user_groups()->whereHas('group', function($query) {
        $query->whereHas('messages', function ($query) {
            $query->whereHas('attachments');
        });
})->with('group')->latest()->paginate($this->group->getPerPage());

编辑。

class User
{
  public function messages()
  {
    return $this->hasMany('App\Models\Message');
  }

  public function user_groups()
  {
    return $this->hasMany('App\Models\GroupUser');
  }
}

class Message
{
  public function attachments()
  {
    return $this->hasMany('App\Models\Attachment'); 
  }

  public function author()
  {
    return $this->belongsTo('App\Models\User');
  }

  public function group()
  {
    return $this->belongsTo('App\Models\Group');
  }
}

class Attachment
{
  public function message()
  {
    return $this->belongsTo('App\Models\Message');
  }
}

class GroupUser
{
  public function user()
  {
    return $this->belongsTo('App\Models\User');
  }

  public function group()
  {
    return $this->belongsTo('App\Models\Group');
  }
}

class Group()
{
  public function messages()
  {
    return $this->hasMany('App\Models\Message');
  }

  public function group_users()
  {
    return $this->hasMany('App\Models\GroupUser');
  }
}
乔纳斯·施陶登迈尔

添加groupsUser模型关系

public function groups() {
    return $this->belongsToMany('App\Models\Group');
}

然后试试这个:

$user->groups()
    ->select('groups.*')
    ->join('messages', function($join) {
        $join->on('groups.id', 'messages.group_id')
            ->where('created_at', function($query) {
                $query->selectRaw('max(created_at)')
                    ->from('messages')
                    ->where('group_id', DB::raw('groups.id'));
            });
    })
    ->whereExists(function($query) {
        $query->from('attachments')
            ->where('attachments.message_id', DB::raw('messages.id'));
    })
    ->orderByDesc('messages.created_at')
    ->paginate($this->group->getPerPage());

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Laravel Eloquent中编写嵌套的单个查询

来自分类Dev

Laravel Eloquent:渴望加载多个嵌套关系

来自分类Dev

Laravel 5 Eloquent中的高级嵌套AND子句

来自分类Dev

代表我在laravel Eloquent中的sql查询

来自分类Dev

在Laravel Eloquent中查询关系内的关系

来自分类Dev

制定趋势查询-Laravel Eloquent

来自分类Dev

Laravel Eloquent左联接查询

来自分类Dev

制定趋势查询-Laravel Eloquent

来自分类Dev

MySQL查询到Laravel Eloquent

来自分类Dev

原始查询到 Laravel Eloquent

来自分类Dev

Laravel Eloquent中的多个LIKE子句

来自分类Dev

如何使用 Eloquent Laravel 嵌套两个查询

来自分类Dev

Eloquent / Laravel:嵌套的延迟渴望加载,但返回多个模型的关系

来自分类Dev

Laravel:在Eloquent中解码JSON

来自分类Dev

如何在Laravel Eloquent ORM中为具有不同条件的多个模型创建联接查询

来自分类Dev

原生 SQL 查询到 Laravel eloquent 查询

来自分类Dev

Laravel Eloquent获取JSON关系嵌套

来自分类Dev

Laravel Eloquent-如何获得嵌套关系

来自分类Dev

Laravel Eloquent获取JSON关系嵌套

来自分类Dev

Laravel 嵌套 ForEach Over Eloquent Collection

来自分类Dev

获取嵌套集合的总和失败 Laravel Eloquent

来自分类Dev

如何使用Laravel Eloquent创建子查询?

来自分类Dev

Laravel / Eloquent-查询-选择关联

来自分类Dev

Laravel Eloquent ORM-查询复杂

来自分类Dev

讨论:Laravel Eloquent VS DB查询附加

来自分类Dev

Laravel Eloquent-__call()函数获取查询

来自分类Dev

Laravel / Eloquent-查询-按关系选择

来自分类Dev

Laravel&Eloquent-查询“朋友”关系

来自分类Dev

Laravel> 使用 Eloquent 查询多对多关系