dedmytro/laravel-model-related-fields

为所有模型Eloquent查询提供添加相关字段/列的能力

0.1 2021-10-23 20:20 UTC

This package is auto-updated.

Last update: 2024-09-24 02:44:16 UTC


README

在不执行额外数据库查询的情况下,为所有模型Eloquent查询添加相关字段/列的能力。它使用子SELECT和连接,因此当数据库中有大量记录时,请考虑额外的数据库负载。

Stable Version Unstable Version Total Downloads License

目录

安装

要获取最新版本的《Laravel Model Related Fields》,只需使用Composer引入项目。

$ composer require dedmytro/laravel-model-related-fields

或者手动更新composer.json中的require块,并运行composer update

{
    "require": {
        "dedmytro/laravel-model-related-fields": "^0.1"
    }
}

使用

HasRelatedFields特质添加到您的模型中,并定义一个返回您想要在每个模型查询上加载的相关字段的数组的addRelatedFields()方法。下面的例子展示了如何通过多级关系加载相关字段,以及如何加载HasMany关系的SUM()。

use Illuminate\Database\Eloquent\Model;
use DeDmytro\LaravelModelRelatedFields\RelatedField;
use DeDmytro\LaravelModelRelatedFields\Traits\HasRelatedFields;
// ...

class Order extends Model
{
    use HasRelatedFields;
    
    // ...
    
    protected function addRelatedFields(): array
    {
        return [
            'country_currency' => 'event.company.country.currency',
            'total' => new RelatedField('items.total', function ($query) {
                $query->selectRaw('SUM(price)');
            }),
        ];
    }

where

'event.company.country.currency'$order->event->company->country->currency相同

'items.total'$order->items()->sum('price')相同

作为替代,您还可以使用$relatedFields属性为简单字段,而不使用RelatedField类。属性和方法的结果数组将合并。

use Illuminate\Database\Eloquent\Model;
use DeDmytro\LaravelModelRelatedFields\RelatedField;
use DeDmytro\LaravelModelRelatedFields\Traits\HasRelatedFields;
// ...

class Order extends Model
{
    use HasRelatedFields;
    
    // ...
    
    protected $relatedFields = [
      'country_currency' => 'event.company.country.currency',
   ];
    
    protected function addRelatedFields(): array
    {
        return [
            'total' => new RelatedField('items.total', function ($query) {
                $query->selectRaw('SUM(price)');
            }),
        ];
    }

查询结果

$order = Order::first();

您将获得包含所有字段和额外相关字段的Order模型

[
    "id" => 1,
    // ...
    "country_currency" => "USD",
    "total" => 25.00,
]

如何禁用/启用

全局禁用

要默认禁用所有模型的相关字段,

  • 发布配置并更改默认值
'enabled' => false
  • 添加环境变量
ENABLE_MODEL_RELATED_FIELDS=false

针对特定模型禁用

添加protected $enableRelatedFields = false

protected $enableRelatedFields = false;

针对当前查询禁用

$order = Order::withoutRelatedFields()->first();

如果全局禁用,则启用当前查询

$order = Order::withRelatedFields()->first();