【问题标题】:How does Laravel find plural of models?Laravel 如何找到模型的复数形式?
【发布时间】:2014-07-19 13:38:09
【问题描述】:

如果我有一个模型“Dog”,Laravel 会将它链接到表“Dogs”。总是复数。 现在,如果我有一个模型“Person”,它会尝试查找表“People”——也是复数形式。但是 Laravel 不只是添加一个“s”,它是如何知道复数的呢? 有所有英文名词的表吗?

【问题讨论】:

标签: laravel laravel-4


【解决方案1】:

Laravel 4

Illuminate\Database\Eloquent\Model.php 中,您会发现str_plural($name)str_plural 是一个使用Str::plural 方法的辅助函数,在这种情况下,此方法如下所示:

public static function plural($value, $count = 2)
{
    return Pluralizer::plural($value, $count);
}

所以很明显,Str::plural 使用了Illuminate\Support\Pluralizer.php 类,你会发现它实际上是如何工作的。只需阅读源代码。 irregular word forms 与其他人有单独的词映射:

// Taken from Illuminate\Support\Pluralizer
public static $irregular = array(
    'child' => 'children',
    'foot' => 'feet',
    'freshman' => 'freshmen',
    'goose' => 'geese',
    'human' => 'humans',
    'man' => 'men',
    'move' => 'moves',
    'person' => 'people',
    'sex' => 'sexes',
    'tooth' => 'teeth',
);

【讨论】:

  • 我的朋友说得好……说得好:)
  • Lara 6 相同
【解决方案2】:

Laravel 5 和 6

Alpha 的答案是针对 Laravel 4。

为了给予应有的荣誉,我想更新 Laravel 5+ 的答案。

Pluralizer 现在从doctrine/inflector 扩展,以避免重新发明轮子。该库包含一些基本规则,例如

(m|l)ouse         => _ice
(buffal|tomat)o   => _oes
...all else...    => append 's'

后跟一些“不变形”(即单复数相同)

deer, fish, etc.

最后是不规则规则,例如

man  => men
ox   => oxen

来自文档:

Doctrine 变形器具有变形文本的静态方法。

这些类中的方法是从几个不同的来源收集的 跨越几个不同的 php 项目和几个不同的作者。这 原作者姓名和电子邮件未知。

Pluralize 和 Singularize 的实现是从 CakePHP 借来的,做了一些修改。

所以有趣的是,所有框架之间有多少相互借用和重用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 2015-11-16
    相关资源
    最近更新 更多