Laravel:通过使用“ With”,是否可以避免对数据库的多次查询/连接?

代码行

以下面的数据库结构为例:

Table Sales
id | customer_id | currency_id | number | due_date

Table Open Accounts
id | sale_id | credit | debit | balance

现在说我要获得所有未结帐户:

SELECT OpenAccounts::select('oa.*')
    ->from('open_accounts As oa')
    ->join('sales AS sale', 'sale.id', '=', 'oa.sale_id')
    ->where('oa.balance', '>', 0)
    ->orderBy('sale.due_date', 'ASC')
    ->get();

如果要遍历所有结果并打印出一些数据,可以执行以下操作:

@foreach ($openAccounts as $open)
    <tr>
        <td>{{ $open->Sale->due_date }}</td>
        <td>{{ $open->Sale->Customer->name }}</td>
        <td>{{ sprintf('%s %s', $open->balance, $open->Sale->Currency->symbol) }}</td>
    </tr>
@endforeach

问题:这意味着对于每个结果,我都打开一个MySQL连接并查询Sale表,Customer表和Currency表?

现在,如果我将代码更改为:

SELECT OpenAccounts::select('oa.*')
    ->with('Sale')
    ->with('Sale.Customer')
    ->with('Sale.Currency')
    ->from('open_accounts As oa')
    ->join('sales AS sale', 'sale.id', '=', 'oa.sale_id')
    ->where('oa.balance', '>', 0)
    ->orderBy('sale.due_date', 'ASC')
    ->get();

通过打印输出,我得到如下信息:

Illuminate\Database\Eloquent\Collection Object
(
    [0] => OpenAccounts Object
    (
        [attributes:protected] => Array
        (
            [id] => 89
            [sale_id] => 150
            [debit] => 184.93
            [credit] => 0
            [balance] => 184.93
        )
        [relations:protected] => Array
        (
            [Sale] => Sales Object 
            (
                [attributes:protected] => Array
                (
                    [id] => 150
                    [customer_id] => 1
                    [currency_id] => 1
                    [number] => 5
                    [due_date] => '2020-03-08'
                )
                [relations:protected] => Array
                (
                    [Customer] => ...
                    [Currency] => ...
                )
            )
        )
    )
)

问题:这是否意味着现在在$open->Sale->Customer->name循环中使用示例时,我没有初始化新的MySQL连接,而是直接访问Eloquent Collection返回的属性?

金刚

你是对的。使用with可使Laravel急于加载,因此将使用较少的数据库调用。

参见https://laravel.com/docs/5.0/eloquent#eager-loading

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

可以避免为内部使用的数据库实现ContentProvider的开销吗?

Laravel/Phpunit:是否可以通过终端强制数据库连接?

我可以在LINQ中对数据库实体使用嵌套查询吗?

是否仅通过事务对数据库进行更改?

Laravel使用数据库列通过特征设置$ fillable

使用Spring Boot对数据库进行错误查询

Laravel Eloquent:是否 $pay->sum('amount'); 对数据库执行另一个查询?

是否建议对数据库使用容器?

是否可以通过执行查询来导出 MySQL 数据库?

有没有一种简单的方法可以避免在使用模型绑定时将空值保存到数据库中

C ++链接是否足够聪明,可以避免未使用的库的链接?

是否可以避免使用 create-react-app 捆绑 React 库?

在检查其他数据库连接时,是否可以通过其他数据库连接来修改Rails应用程序中的模型实例?

是否可以使用Hibernate连接到oracle 12c可插拔数据库?

是否可以以编程方式使用.PF文件连接到数据库

是否可以使用AWS Amplify的GraphQL API设置连接到本地Dynamo数据库?

是否可以在不连接数据库的情况下使用DataGridView?

是否可以使用Mongoose在MongoDB数据库中查询集合?

是否可以在eID脚本的数据库查询中使用限制容器?

Laravel通过API使用API检查数据

laravel,使用foreach通过ID获取数据

通过单一方法但使用多个查询的数据库连接

是否可以通过REST API从元数据库MBQL / SQL查询中获取原始数据?

避免通过 Node 中的 `mssql` 包多次访问 SQL Server 数据库

调用通过构造函数传入的函数时,是否可以避免在Typescript中使用单词“ this”?

是否可以获取一次数据并对其进行性能查询而不是laravel中的数据库?

Laravel是否会自动关闭数据库连接?

是否可以通过SQL备份Firebird数据库?

是否可以通过 jaydebeapi 包(python)写入数据库?