Php 优化集合筛选
我有3个模型:帐户-合作伙伴-用户,其中有3个属于任何关系(帐户\用户,帐户\合作伙伴)。我想筛选所有用户合作伙伴,由用户帐户授权 我已经编写了基本的foreach循环hell,我想问一些优化这个过滤的技巧(比如避免n+1和其他问题)Php 优化集合筛选,php,laravel,eloquent,Php,Laravel,Eloquent,我有3个模型:帐户-合作伙伴-用户,其中有3个属于任何关系(帐户\用户,帐户\合作伙伴)。我想筛选所有用户合作伙伴,由用户帐户授权 我已经编写了基本的foreach循环hell,我想问一些优化这个过滤的技巧(比如避免n+1和其他问题) 您可以这样做: Controller.php $userPartners = collect(); auth()->user()->accounts->each(function($account) use ($userPartners) {
您可以这样做: Controller.php
$userPartners = collect();
auth()->user()->accounts->each(function($account) use ($userPartners) {
$account->partners->each(function($partner) use ($userPartners) {
if(!$userPartners->contains('id', $partner->id)) $userPartners->push($partner);
});
});
dd($userPartners);
首先,通过
load
加载您的关系。这将避免出现N+1
问题:
$user = auth()->user()->load('accounts');
$userPartners = [];
$user->accounts->each(function ($account) use ($userPartners) {
$ids = $account->partners->pluck('id');
if (!in_array($account->id, $ids)) {
$userPartners[] = $account->partners->where('id', $account->id);
}
});
请正确缩进代码
auth()->user
不存在user()
是用于auth()
帮助程序的方法。
$user = auth()->user()->load('accounts');
$userPartners = [];
$user->accounts->each(function ($account) use ($userPartners) {
$ids = $account->partners->pluck('id');
if (!in_array($account->id, $ids)) {
$userPartners[] = $account->partners->where('id', $account->id);
}
});