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 具有雄辩的关系回调函数返回错误记录的主要内容,如果未能解决你的问题,请参考以下文章

为啥 laravel 雄辩的关系返回空数组

如果 id 不为 null 则返回,laravel 雄辩

groupBy 在 laravel 中具有雄辩的关系

在laravel 5.6中雄辩地返回null值

laravel 雄辩的关系一对多返回 null

在 laravel 中具有雄辩关系的更新期间从空值创建默认对象