gpt4 book ai didi

Laravel:使用相关模型的范围来过滤结果

转载 作者:行者123 更新时间:2023-12-02 16:22:01 25 4
gpt4 key购买 nike

TLTR:

如何使用另一个模型(UserSubscriber)的范围方法从一个模型(用户)获取集合?模型之间是一对一的关系。

更多信息:

我有两个模型相关的一对一:

第二种模型仅适用于具有扩展的特定角色的某些用户(在本例中为订阅者)

用户模型:

class User extends \Sentinel\Models\User
{
public function subscriber()
{
return $this->hasOne('App\Models\UserSubscriber', 'user_id');
}
}

用户扩展模型:

class UserSubscriber extends Model
{
public function user()
{
return $this->belongsTo('App\Models\User', 'user_id');
}

public function scopeLangSubscribers($query, $langCode)
{
$query->where('languages_subscribed', 'LIKE', '%' . $langCode . '%');
}
}

目标是:

使用 UserSubscriber 中的范围获取用户集合。

(无需将此范围方法重写为用户模型。)

我陷入困境的地方:

            $users = User::with(['subscriber' => function ($query) use ($lang) {
$query->langSubscribers($lang);
}])->get();

这将返回所有用户的集合,其中一些用户的“订阅者”设置为空。

我尝试过过滤它们,但是:

  • 这可能不是最好的解决方案,因为它从数据库检索所有用户后会迭代整个大用户集合

            $users = $users->filter(function($item) {
    return $item->subscriber != null;
    });

“订阅者”不是一个列,所以我不能这样做:

->whereNotNull('subscriber')

我怎样才能做到这一点?

编辑:

或者,也许有一种方法可以在首先检索后将一个(订阅者)集合转换为另一个(用户)集合,这可以非常简单和干净地完成:

$usersSubscribers = UserSubscriber::langSubscribers($lang)->get();

最佳答案

使用 whereHas 代替。

$users = User::with('subscriber')->whereHas('subscriber', function    ($query) use ($lang) {
$query->langSubscribers($lang);
})->get();

关于Laravel:使用相关模型的范围来过滤结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30934589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com