如何在 Eloquent 查询关系中使用模型的属性

Posted

技术标签:

【中文标题】如何在 Eloquent 查询关系中使用模型的属性【英文标题】:How Use a Property of a Model in Eloquent Querying Relations 【发布时间】:2022-01-05 17:03:09 【问题描述】:

我有三个模型。大学,教授和学生。 他们有一些关系。

    大学模型:
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Models\User;

class University extends Model

    protected $fillable = ['name', 'user_id'];

    /**
     * Get the user that owns the university.
     */
    public function owner()
    
        return $this->belongsTo(User::class);
    

    教授型号:
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Models\University;
use App\Models\Student;

class Professor extends Model

    protected $fillable = ['name', 'surname', 'university_id'];

    /**
     * Get the university where the professor teaches.
     */
    public function university()
    
        return $this->belongsTo(University::class);
    

    /**
     * Get the student associated with the professor.
     */
    public function student()
    
        return $this->hasOne(Student::class)->withDefault();
    

    学生模型:
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Models\University;
use App\Models\Professor;

class Student extends Model

    protected $fillable = ['name', 'surname', 'age', 'university_id', 'professor_id'];

    /**
     * Get the university where the student is studying.
     */
    public function university()
    
        return $this->belongsTo(University::class);
    

    /**
     * Get the professor of the student.
     */
    public function professor()
    
        return $this->belongsTo(Professor::class);
    

每位教授都属于一所大学。 每个学生都属于一所大学。 每个学生只有一位教授,但一位教授可能没有学生。

问题: 如何获得与教授在同一所大学的学生名单?

以下代码不正确!

$students = Student::select('id', 'name', 'surname', 'age', 'university_id')
->whereRelation('professor', 'university_id', '=', ***'student.university_id'***) 
->with(['university', 'professor'])
->orderBy('id', 'desc')
->paginate(20);

谢谢。

【问题讨论】:

在什么情况下学生与教授在不同的大学? 也许是大学的客座教授 【参考方案1】:

如果您传递了 $universityId,则应遵循第一个示例。否则,您可以通过分组 university_id

获得所有学生

第一个例子:

$students = Student::with(['university', 'professor'])
              ->where('university_id', '=', $universityId)
              ->orderBy('id', 'desc')
              ->paginate(20);

第二个例子:

$students = Student::with(['university', 'professor'])
              ->groupBy('university_id')
              ->orderBy('id', 'desc')
              ->paginate(20);

【讨论】:

以上是关于如何在 Eloquent 查询关系中使用模型的属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel Eloquent 中构建具有多级关系的查询

如何在 Laravel 中定义 Eloquent 关系

如何查询 Laravel Eloquent 的 belongsTo 关系?

Laravel Eloquent - 如何将范围查询内的计算值作为模型列或集合属性返回

用 Eloquent 查询关系

Laravel 通过属性获得雄辩的查询构建器关系