(Laravel) 只检索有关系的用户

(Laravel) only retrieving users that have a relationship

在我的站点中,我有用户和项目。用户可以创建项目。我想得到一个包含所有用户的数组,其中有物品的用户在前,没有物品的用户在后。

到目前为止我已经这样做了:

$users = User::all();
foreach($users as $user) {
    if ($user->item) {
        $sortedUsers + $user;
    }
// now loop again and add users without relationship

这是非常低效的,我相信有更好的方法来做到这一点。

没有看到 ItemsUsers 的关系,我不确定这是否可行,但您可以尝试以下操作:

$users = Users::select('users.*')->orderBy('items.id')->with('items')->get();

或者它可能只适用于:

$users = Users::orderBy('items.id')->with('items')->get();

更新

$users = Users::orderBy('items.id')->join('items', 'items.user_id', '=', 'users.id')->get();

可以查询是否存在关系

$users = User::has('items')->with('items')->get();

使用该语法,您告诉 laravel 获取所有拥有某个项目的用户并预先加载这些项目;

编辑: 阅读后,您似乎并不真正想要这些物品,只是拥有物品的用户,在这种情况下,您只需要

$users = User::has('items')->get();

你可以试试

$users = User::with('item')->get();

foreach ($users as $user) {

echo $User->item->name; 

}

您可以使用 has() to get users with items and doesntHave() 获取没有商品的用户:

$withItems = User::has('items')->get();

$withoutItems = User::doesntHave('items')->get();

然后merge()两个集合:

$users = $withItems->merge($withoutItems);

你说你想要一个数组,所以你可以用 toArray()

将结果转换成数组
$array = $users->toArray();