Laravel 5 具有雄辩的关系回调函数返回错误记录
Posted
技术标签:
【中文标题】Laravel 5 具有雄辩的关系回调函数返回错误记录【英文标题】:Laravel 5 with eloquent relation callback function returning wrong records 【发布时间】:2022-01-12 22:11:36 【问题描述】:这是用户模型
public function userpackages()
return $this->hasMany('App\UserPackages');
试图从特定月份和年份获取用户包,但它返回所有记录。
$users = User::with(['team', 'userpackages' => function($package) use($month,$year)
$package->whereMonth('created_at', $month)->whereYear('created_at', $year);
])->get();
正在抓取
foreach ($users as $key => $user)
$userpackages = $user->userpackages;
【问题讨论】:
您能分享一下查询吗?使用toSql()
而不是get()
感谢您的宝贵时间@John $users = User::with(['team', 'userpackages' => function($package) use($month,$year) $package-> whereMonth('created_at', $month)->whereYear('created_at', $year); ])->where('id', 4776)->toSql(); "从users
中选择 * id
= ?"
感谢@lagbox laravel/framework": "5.5.*
也许我读错了你的问题......你是否试图将用户限制为只有具有符合该标准的用户包的用户?还是仅将这种关系的急切加载限制为仅匹配该条件的那些用户包?
实际上我想从特定月份获取用户团队包。那就是我的团队关系 public function team() return $this->hasMany(User::class,'referrer_id','id');
【参考方案1】:
如果我理解正确,您正在过滤急切负载,但这不会影响返回的模型。您需要使用whereHas()
重复过滤以限制返回的模型。此外,像whereDate()
这样的函数效率可能非常低,尤其是在列被索引的情况下。我建议在搜索日期范围时使用whereBetween()
。
$date = Carbon::createFromFormat("Y-m", "$year-$month");
$range = [$date->startOfMonth(), $date->endOfMonth()];
$users = User::with('team')
->with(['userpackages' => fn ($q) => $q->whereBetween('created_at', $range)])
->whereHas('userpackages', fn ($q) => $q->whereBetween('created_at', $range)
->get();
进一步解释:
User::with('userpackages')
返回所有用户,每个用户都有他们的所有包。
User::with(['userpackages' => 'some condition'])
返回所有用户,每个用户都有自己的一些包
User::whereHas('userpackages', 'some condition')
返回一些用户,每个用户都有他们所有的包
User::(['userpackages' => 'some condition'])->whereHas('userpackages', 'some condition')
返回一些用户,每个用户都有一些包。
【讨论】:
以上是关于Laravel 5 具有雄辩的关系回调函数返回错误记录的主要内容,如果未能解决你的问题,请参考以下文章