laravel 在Eloquent Collection中将关系加载为布尔值

jogvjijk  于 2023-03-31  发布在  其他
关注(0)|答案(4)|浏览(110)

我有一个具有hasMany students关系的教室模型。我想用雄辩的构建器在一个查询中检查每个教室是否有学生。我也不想退出学生计数。has函数过滤没有学生的教室:

//Classroom model

class Classroom extends Model
{
    public function students(): HasMany
    {
        return $this->hasMany(Student::class);
    }
}

尝试使用:

Classroom::has('students')->get();

但它只返回有学生的模型,而不是我想要的。预期结果:

[
    {
        "has_students": false
    },
    {
        "has_students": false
    },
    {
        "has_students": true
    },
    {
        "has_students": true
    },
    {
        "has_students": false
    }
]
f4t66c6m

f4t66c6m1#

作为Amade的回答的后续,我们现在有一个withExists方法来检查关系的存在性。所以你应该可以这样做:

Classroom::withExists('students')->get();

然后,每个Classroom对象将有一个名为students_exists的属性(属性)(我相信是基于文档)。如果你愿意,你可以将其别名为has_students

Classroom::withExists('students as has_students')->get();

我没有测试过这个,但根据文档,这应该是你正在寻找的。
如果希望返回特定的数据结构,可以执行Amade演示的mapWithKeys方法或使用转换器(API参考资料)。
Laravel 10.x Docs - Eloquent - Relationships - Other Aggregates - withExists

6za6bjd0

6za6bjd02#

您可以通过以下方式实现:

App\Models\Classroom::withCount('students')->get()->mapWithKeys(fn ($classroom) => [$classroom->id => ['has_studends' => $classroom->studends_count > 0]]);

也就是说,使用Eqloquent将classes表与每个教室中的学生计数连接起来,然后将结果与您的条件进行Map。

dm7nw8vv

dm7nw8vv3#

尝试添加has_stuents属性访问器

use Illuminate\Database\Eloquent\Casts\Attribute;
...

protected function hasStudents(): Attribute
{
    return Attribute::make(
        get: fn ($value) => $this->students->count > 0;
    );
}
iqih9akk

iqih9akk4#

您可以向Classroom模型添加一个“hasStudents”方法,该方法使用“exists”方法来检查是否有任何学生与该类相关联。下面是一个示例代码:

class Classroom extends Model
{
    public function students(): HasMany
    {
        return $this->hasMany(Student::class);
    }

    public function hasStudents(): bool
    {
        return $this->students()->exists();
    }
}

然后,要获取具有“has_students”属性的对象数组,该属性指示每个班级是否有学生,您可以运行查询以检索所有教室并使用“map”方法创建所需的数组:

$classrooms = Classroom::all();
$classroomData = $classrooms->map(function ($classroom) {
    return [
        'has_students' => $classroom->hasStudents()
    ];
});

最后,您可以使用“toJson”方法将$classroomData转换为JSON:

$jsonData = $classroomData->toJson();

这将为每个类生成具有“has_students”属性的所需JSON数组。

相关问题