繁体   English   中英

如何避免 Laravel Eloquent Model 属性和方法的混合命名约定

[英]How to avoid mixed naming conventions on Laravel Eloquent Model properties and methods

对 Laravel/Eloquent 模型中的命名约定有疑问。 当为“产品类别”或“车主”等表属性使用组合名称时,命名约定是使用蛇形大小写,因此应为“product_categories”或“car_owner”。

另一方面,PHP 和 Laravel 对方法名称使用驼峰式大小写,在使用具有关系的模型时会导致两种约定的混淆。 因为在那里我必须使用方法来链接相关模型(belongsTo 等)

这是一个例子:

namespace App\Models;
use Illuminate\Database\Eloquent\Model;

class Product extends Model
{

    // Example for a direct property in that product model:
    // "capacity_qty" (Double)        

    // Get the capacity unit object from related model
    public function capacityUnit(): BelongsTo {
        return $this->belongsTo(CapacityUnit::class);
    }
}

如您所见,产品 model 有两个属性,现在必须按照不同的命名约定访问它们:

  • $product-> capacity_qty用于直接 model 属性(蛇形案例)
  • $product-> capacityUnit获取与产品相关的CapacityUnit object(驼峰式)

我遵循了官方 Laravel 文档,但没有组合方法/属性名称的示例。

您是否有提示我如何在这种情况下始终对方法和属性使用驼峰式大小写,而不为每个属性创建辅助方法并且不破坏数据库端的命名约定?

谢谢和最良好的祝愿,迈克尔

SQL 不区分大小写,所以

select capacityQty from CapacityUnit

//is equivalent to

select capacityqty from capacityunit

因此,对表名和列名使用小写字母是一种惯例。

在 Laravel model 中,属性表示将存储模型实体的所有记录的表的列名

因此遵循 SQL 的约定,Laravel 也使用小写的表名和模型的属性名

但是对于 class 名称,它遵循使用 PascalCase 的约定 - 在各种 Object 面向编程语言中被广泛接受和遵循

我完全理解这两种约定,而且都有意义。 然而,它导致访问具有关系的模型中的属性的方式不一致。

不幸/幸运的是 - 这是由于事实 - SQL/数据库和 Object 面向编程语言基本上是不同的世界并遵循不同的约定。

您可以在命名表和列名时遵循一致的约定。 例如:

表名:PascalCase 或小写复数,按照约定

栏目名称:camelCase

保持一致是要记住的关键。

但是,在使用 Laravel 时,遵循上述约定将需要一些额外的工作

  • 在 model class 上声明表属性protected $table = 'CapacityUnit'
  • 定义关系时指定列名,如果外键是驼峰式和表名

然后,您可以将 camelCase 用于 model 属性名称。

但很明显 - 尝试使用 camelCase 访问属性的一致方式需要在使用 Eloquent 时付出巨大的额外努力,而且似乎不值得。 此外,总是存在人为错误因素的可能性,尤其是在团队环境中。

在大多数情况下,使用 MySQL、Postgres、SQL 服务器等关系数据库,除了在某些边缘情况下可能会产生一些副作用外,不会有任何重大问题。

但是,有一些现代数据库遵循全大写或小写的约定,这可能会产生重大的副作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM