【问题标题】:Laravel: Use scope from related model to filter resultsLaravel:使用相关模型的范围来过滤结果
【发布时间】:2015-09-05 05:26:52
【问题描述】:

TLTR:

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

更多关于:

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

第二种模式仅适用于某些具有扩展的特定角色的用户(在这种情况下为订阅者)

用户模型:

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;
            }); 
    

'subscriber' 不是专栏,所以我做不到:

->whereNotNull('subscriber')

我怎样才能做到这一点?

编辑:

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

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

【问题讨论】:

  • 我不确定你想要完成什么。为什么一个用户只有一个订阅者?一个用户肯定应该有很多订阅者吗?
  • 用户“有一个”订阅者的意思是:这个用户是订阅者。因为不是每个用户都是订阅者,所以这些附加信息存储在附加表中。

标签: laravel eloquent laravel-5


【解决方案1】:

请改用whereHas

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

【讨论】:

  • 是的,没错,谢谢你。 (只是固定语法)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
相关资源
最近更新 更多