D. *_*ski 3 laravel eloquent laravel-5
总长度:
如何使用另一个模型(用户订阅者)的范围方法从一个模型(用户)获取集合?模型是一对一的关系。
更多关于:
我有两个一对一相关的模型:
第二种模型仅适用于具有扩展的特定角色的某些用户(在本例中为订阅者)
用户模型:
class User extends \Sentinel\Models\User
{
public function subscriber()
{
return $this->hasOne('App\Models\UserSubscriber', 'user_id');
}
}
Run Code Online (Sandbox Code Playgroud)
用户扩展模型:
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 . '%');
}
}
Run Code Online (Sandbox Code Playgroud)
目标是:
使用 UserSubscriber 中的范围获取用户集合。
(无需将此范围方法重写为用户模型。)
我卡住的地方:
$users = User::with(['subscriber' => function ($query) use ($lang) {
$query->langSubscribers($lang);
}])->get();
Run Code Online (Sandbox Code Playgroud)
这将返回所有用户的集合,其中一些用户的“订阅者”设置为空。
我尝试过过滤它们,但是:
它可能不是最好的解决方案,因为它在从数据库检索所有用户后迭代整个大用户集合
$users = $users->filter(function($item) {
return $item->subscriber != null;
});
Run Code Online (Sandbox Code Playgroud)“订阅者”不是一列,所以我不能这样做:
->whereNotNull('subscriber')
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
编辑:
或者,也许有一种方法可以在首先检索后将一个(订阅者)集合转换为另一个(用户)集合,这可以非常简单和干净地完成:
$usersSubscribers = UserSubscriber::langSubscribers($lang)->get();
Run Code Online (Sandbox Code Playgroud)
whereHas代替使用。
$users = User::with('subscriber')->whereHas('subscriber', function ($query) use ($lang) {
$query->langSubscribers($lang);
})->get();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14992 次 |
| 最近记录: |