Как Laravel находит множество моделей?

Если у меня есть модель "Собака", Ларавел свяжет ее со столом "Собаки". Всегда множественное число. Теперь, если у меня есть модель "Человек", она пытается найти таблицу "Люди" - также множественное число. Но как Laravel знает множественное число, когда это больше, чем просто добавление "s"? Есть ли табличка со всеми английскими существительными?

Ответы

Ответ 1

В 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',
);

Ответ 2

Альфа-ответ был для Laravel 4.

Чтобы дать кредит там, где я должен был обновить ответ для Laravel 5.

Pluralizer теперь выходит из Doctrine\Common\Inflector\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 с некоторыми изменениями.

Так интересно, насколько все структуры заимствуют и повторно используют друг друга.