如何使用 whereHas 子句和关系获取数据?

Posted

技术标签:

【中文标题】如何使用 whereHas 子句和关系获取数据?【英文标题】:how to get the data using whereHas clauses and relationship? 【发布时间】:2020-08-28 05:27:48 【问题描述】:

用户表

id
email
password

成员表

id
user_id
expiry_date
delivery_day_innum(eg:like 7,8 days)

deliverdetailes 表

id
user_id
created_at
updated_at

商品表

id
user_id
name
qty

商品表

id
user_id
name
qty

关系

user->hasOne(Membership::class)
user->hasMany(Deliverdetailes::class)
user->hasMany(Goods::class)

现在,我想获取帐户未过期且deliver_day_innum 等于 当前日期与最新 created_at 日期之间的差异

【问题讨论】:

你到底想要什么??符合条件的用户各自的商品? 是的,你是对的@hitler_jr10 【参考方案1】:
$myGoods= Goods::join('user','user.id','goods.user_id')
->join('membership','membership.user_id','=','user.id')
->join('deliverdetailes','deliverdetailes.user_id','=','user.id')
->whereDate('expiry_date','>',Carbon::now())
->whereRaw('DATEDIFF(maxDate, CURDATE())=membership.delivery_day_innum')
->select('goods.*',DB::raw('max(deliverdetailes.created_at) as maxDate'))->get();

【讨论】:

你介意用 ORM 写吗?我很欣赏你的工作 一般是ORM,除了两次使用“raw”外,必须使用mysql的(DATEDIFF ,max)函数,而对于'join'是必须的,我不知道其他方法它没有加入。 您可以使用高级查询,但复杂性相同:laravel.com/docs/7.x/eloquent#advanced-subqueries【参考方案2】:

第一个问题:未过期账户的商品:

调整 Carbon::now() 以匹配 expiry_date 的日期格式。

   $goods = Good::whereHas('user.membership', function($query)
       return $query->where('expiry_date', '<=', Carbon::now());
   )->get();

App\Good 中的必需项:与 App\User 的关系。

public function user()

    return $this->belongsTo('App\User');

第二个问题:请澄清:“deliver_day_innum 等于当前日期与最新 created_at 日期之间的差”。

【讨论】:

以上是关于如何使用 whereHas 子句和关系获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel关系列'id'在where子句中不明确

使用 whereHas 和关系列的总和进行查询

Laravel - 搜索关系,包括 whereHas 中的 null

Laravel Eloquent 关系——相当于 MYSQL “join”

Laravel Eloquent:如何通过 whereHas() 方法获取相关记录?

Laravel whereHas on Many-to-Many 关系