通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品
          Image

          客户为中心的产品管理工具

          Image

          专业的软件研发项目管理工具

          Image

          简单易用的团队知识库管理

          Image

          可量化的研发效能度量工具

          Image

          测试用例维护与计划执行

          Image

          以团队为中心的协作沟通

          Image

          研发工作流自动化工具

          Image

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          Image
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

什么是 Laravel Eloquent Eager Loading

Laravel Eloquent Eager Loading,即Laravel渴求式加载,是一种优化数据库查询的方法。在 Laravel Eloquent 中,使用 with() 方法进行 Eager Loading,可以一次性加载多个关联模型数据,可以通过点语法来指定嵌套的关联关系。

Image

一、什么是 Laravel Eloquent Eager Loading

Laravel Eloquent Eager Loading 是一种优化数据库查询的方法,可以避免在一个循环中多次查询数据库而导致的性能问题。

当需要获取一个模型及其关联模型的数据时,如果使用常规的查询方法,每个关联模型都会独立执行一条数据库查询,从而导致数据库查询次数的增加和潜在的性能问题。而使用 Eager Loading,则可以预先加载关联数据,减少数据库查询次数,提高性能。

它的核心是Eager Loading,它告诉Eloquent你想要抓取一个具有特定关系的模型,这样框架就会产生一个更高效的查询来抓取你需要的所有数据。通过快速加载,您可以将许多查询减少到一个或两个。

二、Eloquent 模型约定

现在,我们来看一个 Flight 模型的示例,我们将用它从 flights 数据库表中检索和存储数据信息:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    //
}

1、数据表名称

请注意,我们并没有告诉 Eloquent 我们的 Flight 模型使用哪个数据表。 除非明确地指定了其它名称,否则将使用类的复数形式「蛇形命名」来作为表名。因此,在这种情况下,Eloquent 将假设 Flight 模型存储的是 flights 数据表中的数据,而 AirTrafficController 模型会将记录存储在 air_traffic_controllers 表中。

你可以通过在模型上定义 table 属性来指定自定义数据表:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    /**
     * 与模型关联的表名
     *
     * @var string
     */
    protected $table = 'my_flights';
}

2、主键

Eloquent 也会假设每个数据表都有一个名为 id 的主键列。你可以定义一个受保护的 $primaryKey 属性来重写约定。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    /**
     * 与表关联的主键
     *
     * @var string
     */
    protected $primaryKey = 'flight_id';
}

此外,Eloquent 假设主键是一个自增的整数值,这意味着默认情况下主键会自动转换为 int 类型。如果您希望使用非递增或非数字的主键则需要设置公共的 $incrementing 属性设置为 false:

<?php

class Flight extends Model
{
    /**
     * 主键是否主动递增
     *
     * @var bool
     */
    public $incrementing = false;
}

如果你的主键不是一个整数,你需要将模型上受保护的 $keyType 属性设置为 string:

<?php

class Flight extends Model
{
    /**
     * 自动递增主键的「类型」
     *
     * @var string
     */
    protected $keyType = 'string';
}

3、时间戳

默认情况下,Eloquent 预期你的数据表中存在 created_at 和 updated_at 两个字段 。如果你不想让 Eloquent 自动管理这两个列, 请将模型中的 $timestamps 属性设置为 false:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    /**
     * 是否主动维护时间戳
     *
     * @var bool
     */
    public $timestamps = false;
}

如果需要自定义时间戳的格式,在你的模型中设置 $dateFormat 属性。这个属性决定日期属性在数据库的存储方式,以及模型序列化为数组或者 JSON 的格式:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    /**
     * 模型日期的存储格式
     *
     * @var string
     */
    protected $dateFormat = 'U';
}

如果你需要自定义存储时间戳的字段名,可以在模型中设置 CREATED_AT 和 UPDATED_AT 常量的值来实现:

<?php

class Flight extends Model
{
    const CREATED_AT = 'creation_date';
    const UPDATED_AT = 'last_update';
}

4、数据库连接

默认情况下,Eloquent 模型将使用你的应用程序配置的默认数据库连接。如果你想为模型指定一个不同的连接,设置 $connection 属性即可:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    /**
     * 模型的数据库连接名
     *
     * @var string
     */
    protected $connection = 'connection-name';
}

延伸阅读1:Laravel 的 Eloquent ORM 是什么

Laravel 的 Eloquent ORM 提供了一个漂亮、简洁的 ActiveRecord 实现来和数据库交互。每个数据库表都有一个对应的「模型」用来与该表交互。你可以通过模型查询数据表中的数据,以及在数据表中插入新记录。

Image
相关文章