Laravel中的pluck和implode方法是什么?

3
我有三个类:学生(Student)、会话(Session)和学生班级(student Class),它们之间存在关系(Student与Enrollment有关,Session与Enrollment有关,student Class与Enrollment有关)。当我执行echo时,它会显示结果[{"id":1,"school_id":1,"class_id":1,"student_id":1,"session_id":1,"created_at":null,"updated_at":null}],我已经从学生班级中取出了值。
{{implode(',',$en->school()->get()->pluck('school_name')->toArray())}}

请注意它正在工作。

从 Session 中提取数据时,它也可以正常工作,但是当我从 student 类中提取并需要 class_name 时,它不会显示错误,但不会从 studentclass 中提取值。这里是在 blade.php 中相同类型的查询。

{{implode(',',$en->studentclass()->get()->pluck('class_name')->toArray())}}

这是在StudentClass控制器中的一对多关系

public function enrollments()
    {
        return $this->hasMany(Enrollement::class);
    }

注册课程

public function studentclass()
    {
        return $this->belongsTo(StudentClass::class);
    }

如何使用此关系从表中选择class_name值。谢谢。
3个回答

3

首先,注意可以在 illuminate/collection 方法中使用 implode 方法:

{{ $en->school()->get()->pluck('school_name')->implode(', ') }}

这可以进一步缩短为

{{ $en->school->pluck('school_name')->implode(', ') }}

学生类可以像这样拔出
{{ $en->studentclass->pluck('enrollments.class_name')->implode(', ') }}

使用点语法访问类名。
为了防止这种情况引起n+1问题并减少查询次数,您应该懒加载关系:
{{ $en->load('studentclass.enrollments')->studentclass->pluck('enrollments.class_name')->implode(', ') }}

你也可以预先加载它:

$en = Enrollment::with('studentclass.enrollments')->where('id', $id)->first();

{{$en->school()->pluck('school_name')->implode(', ') }} 或者 {{implode(',',$en->school()->get()->pluck('school_name')->toArray())}} 两种方法都可以,但是无法从studentclass函数中获取class_name,即使关系是正确的。如果我输出$en,它会从Enrollement类中获取class_id。 - inasar
echo $en显示以下结果[{"id":1,"school_id":1,"class_id":1,"student_id":1,"session_id":1,"created_at":null,"updated_at":null}]这意味着我们有class_id,为什么我们不能使用Enrollement Model中的relationship函数studentclass来选择class_name? - inasar
如果你看到我回答中的第二个例子,它展示了如何实现这一点。 - Andrew Willis

0
你可以使用简单的.符号来获取关系列,如下所示。
{{ implode(',', $en->studentclass()->pluck('studentclass.class_name')->toArray()) }}

这里,它形成为关系

{{$en->school()->pluck('school_name')->implode(', ') }} 或者 {{implode(',',$en->school()->get()->pluck('school_name')->toArray())}} 两种方法都可以,但是无法从studentclass函数中获取class_name,即使关系是正确的。如果我打印$en,它会从Enrollement类中获取class_id。 - inasar
echo $en显示以下结果[{"id":1,"school_id":1,"class_id":1,"student_id":1,"session_id":1,"created_at":null,"updated_at":null}]这意味着我们有class_id,为什么我们不能使用Enrollement Model中的relationship函数studentclass来选择class_name? - inasar

0
我已经在Enrollment Model中修改了studentclass函数。
public function studentclass()
    {
        return $this->belongsTo(StudentClass::class,'id');
    }

只需在视图中添加'id'并使用pluck函数

{{implode(',',$en->studentclass()->get()->pluck('class_name')->toArray())}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接