php - Laravel:根据 Eloquent 关系获取用户

标签 php mysql laravel laravel-5 eloquent

我有一个 User 模型,其中包含一个属性 type 以及其他属性。类型用于识别 parent child

parent 和 child (学生)具有多对多关系。 学生还属于一个或多个(模型)。

用户模型

/**
 * Filter the scope of users to student type.
 *
 * @param $query
 */
public function scopeStudent($query){
    $query->where('type', '=', 'std');
}

/**
 * Filter the scope of users to parent type.
 *
 * @param $query
 */
public function scopeParent($query){
    $query->where('type', '=', 'prt');
}

/**
 * List of groups the user is associated with.
 *
 * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
 */
public function groups(){
    return $this->belongsToMany('\App\Group', 'group_user_assoc')
                ->withTimestamps();
}

/**
 * List of students associated with the user(parent).
 *
 * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
 */
public function children(){
    return $this->belongsToMany('\App\User', 'student_parent_assoc', 'parent_id', 'student_id')
                ->withPivot('relation');
}

/**
 * List of parents associated with the user(student).
 *
 * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
 */
public function parents(){
    return $this->BelongsToMany('\App\User', 'student_parent_assoc', 'student_id', 'parent_id')
                ->withPivot('relation');
}

上述关系运行正常。

下面是我的关联表。

student_parent_assoc
----------------------
+------------+------------------+------+-----+
| Field      | Type             | Null | Key |
+------------+------------------+------+-----+
| student_id | int(10) unsigned | NO   | PRI |
| parent_id  | int(10) unsigned | NO   | PRI |
| relation   | varchar(25)      | YES  |     |
+------------+------------------+------+-----+

group_user_assoc
----------------------
+------------+------------------+------+-----+
| Field      | Type             | Null | Key |
+------------+------------------+------+-----+
| group_id   | int(10) unsigned | NO   | MUL |
| user_id    | int(10) unsigned | NO   | MUL |
| created_at | timestamp        | NO   |     |
| updated_at | timestamp        | NO   |     |
+------------+------------------+------+-----+

我需要找到不属于任何群体的学生及其 parent 。我已经找到这样的学生了

$students = User::student()
                ->whereDoesntHave('groups')
                ->get();

问题: 现在我想找到这些学生的家长。但我无法为此构建 Eloquent 查询。我该怎么做?

注意:我可以从上面的查询中获取学生集合,并运行 foreach 循环来让他们的 parent 像这样

$parents = new Collection;
foreach($students as $student) {
    foreach($student->parents as $parent) {
        $parents->push($parent);
    }
}
$parents = $parents->unique();

但我需要一个 Builder 对象,而不是 Collection,因为我正在使用 Datatables server side processingYajra/datatables .

最佳答案

要加载parents关系,您必须使用预先加载。 2 个方法是 with($relation)load($relation)。区别只是你让 parent 已经有了结果对象或者稍后加载它们。

因此,在您的示例中,要获取 parent ,您可以使用 with('parents') 或者如果您想修改结果集:

User::student()
->with(['parents' => function ($parentsQueryBuilder) {
    $parentsQueryBuilder->where('condition', 1)->whereIn('condition2', [1,2,3]);
}])
->whereDoesntHave('groups')
->get();

然后,您也将与您的 parent 建立关系,但性能会很高,因为您只需花费一次查询即可将 parent 加载到您的对象中。然后,如果需要,您可以将它们提取到一个集合中,如下所示:

$students->pluck('parents')->flatten()->unique();

或者示例 2 - 如果您只需要与所选学生相关的所有家长 - 几乎与急切加载相同:

$studentIds = $students->modeKeys();
User::parent()->whereHas('children', function ($query) use($studentIds) {
    $query->whereIn('id', $studentIds);
})->get();

已更新

要获得 parent 的 build 者,请尝试以下操作:

/** BelongsToMany   <- relation query builder */    
$relation = with(new User)->query()->getRelation('parents');

$relation->addEagerConstraints($students->all());

这将为您创建 BelongsToMany 关系的新实例,并将 whereIn($studentIds) 的约束附加到它。然后点击 ->get() 你必须接收相关的 $parents

关于php - Laravel:根据 Eloquent 关系获取用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39804963/

相关文章:

php - 在 laravel 5.7 中使用 ajax 技术

php - laravel pgsql 中的 failed_jobs 表

javascript - 如何使用 Ajax 返回的对象

php - mysql 中的 select 命令不返回任何行

mysql - 酒店预订申请 客房供应情况

C# MySQL 错误 "Column count doesn' t 匹配第 1 行的值计数"

php - 使用一个提交按钮处理多个选择选项

php - 来自 Yoast on wordpress 的 Echo 页面描述

Mysql多表创建

javascript - 无法在 php 文件中调用 javascript 函数(Laravel)