【发布时间】: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