dedmytro / laravel-model-related-fields
为所有模型Eloquent查询提供添加相关字段/列的能力
0.1
2021-10-23 20:20 UTC
Requires
- php: ^7.2.5|^8.0
- illuminate/support: ^7.0|^8.0
Requires (Dev)
- mockery/mockery: ^1.0
- orchestra/testbench: ^6.0
- phpunit/phpunit: ^9.0
README
在不执行额外数据库查询的情况下,为所有模型Eloquent查询添加相关字段/列的能力。它使用子SELECT和连接,因此当数据库中有大量记录时,请考虑额外的数据库负载。
目录
安装
要获取最新版本的《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();