Как 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 с некоторыми изменениями.
Так интересно, насколько все структуры заимствуют и повторно используют друг друга.