📜  laravel eloquent hasmany select - PHP (1)

📅  最后修改于: 2023-12-03 15:02:34.851000             🧑  作者: Mango

Laravel Eloquent 的 hasMany 方法

在 Laravel 中,Eloquent 提供了 hasMany 方法用于定义一个模型与多个其它模型之间的一对多关系。使用 hasMany 方法,可以定义一个模型与其它模型的关系,并且能够轻松地查询、保存及删除这些关联模型。

定义关联关系

定义 hasMany 关联关系,需要在模型中编写方法,如下所示:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    /**
     * 获取该文章下的所有评论
     */
    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
}

通过在关联方法中调用 hasMany 方法,可以指定关联的模型,如上面的例子中,关联的模型为 Comment

加载关联关系

当模型定义了 hasMany 关联方法后,可以通过使用 with 方法来预加载关联模型,以避免在之后的查询中出现 N + 1 问题,如下所示:

$posts = App\Models\Post::with('comments')->get();

foreach ($posts as $post) {
    // 访问预载入的 comments 关联关系
    foreach ($post->comments as $comment) {
        //
    }
}

使用 with 方法定义要预加载的关联关系以及它们的名称,方法的参数是关系名称,可以链式调用多个关系名进行预加载。

选择特定字段

当预加载关联关系时,有时只需选择关联模型的特定字段,可以在 with 方法中传递一个闭包,来定义要选择的字段,如下所示:

$posts = App\Models\Post::with(['comments' => function ($query) {
    $query->select('id', 'post_id', 'body');
}])->get();

这里,我们传递了一个闭包,将要预加载的关联关系以及关联关系的名称 comments 指定为 with 方法的参数。在闭包中,我们使用 select 方法来定义要选择的字段:id, post_id 以及 body。在查询中,只有这三个字段将被选择。

如何进行筛选

有时,我们需要对关联的模型进行进一步筛选,可以在关联方法中传递参数,在关联查询中添加额外的限制条件,如下所示:

public function comments()
{
    return $this->hasMany(Comment::class)->where('status', 1);
}

这里,我们在关联查询中添加了一个限制条件,只获取 status 值等于 1 的评论。在使用 with 方法预加载关联时,只有关联模型满足限制条件的记录才会被选择。

总结

使用 hasMany 方法,您可以在 Laravel 应用程序中轻松地定义一个模型与多个其它模型之间的一对多关系。它允许您预加载关联关系,选择特定的关联字段以及对相关模型进行筛选。在使用这个方法时,记住优化性能,避免出现 N + 1 问题以及选择合适的选择特定字段。