¿Cómo encuentra Laravel el plural de modelos?

2 minutos de lectura

avatar de usuario de almo
almo

Si tengo un Modelo “Perro”, Laravel lo vinculará a la tabla “Perros”. Siempre el plural. Ahora, si tengo un Modelo “Persona”, intenta encontrar la tabla “Personas”, también el plural. Pero, ¿cómo reconoce Laravel el plural cuando se trata de algo más que agregar una “s”? ¿Hay una tabla con todos los sustantivos en inglés?

  • Probablemente alguna versión de esto: php.net/manual/en/function.ngettext.php

    –Dylan Brams

    29 mayo 2014 a las 21:57

  • La respuesta marcada como correcta a continuación ya no es relevante. Sin embargo, la respuesta correcta para v.5 se encuentra a continuación.

    – PapaHotelPapa

    04/03/2016 a las 18:10

El avatar de usuario de Alpha
el alfa

Laravel 4

En el Illuminate\Database\Eloquent\Model.php encontrarás algo como str_plural($name) y str_plural es una función auxiliar que utiliza Str::plural método y en este caso, este método se ve así:

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

Entonces es obvio que, Str::plural clase de usos Illuminate\Support\Pluralizer.php y allí encontrará cómo funciona realmente. Basta con leer el código fuente. Hay un mapeo de palabras separado para irregular word forms con otros:

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

  • bien puesto amigo… bien puesto 🙂

    – caja de retraso

    29 mayo 2014 a las 22:27

  • Lo mismo para Lara 6

    – ymakux

    30 de marzo de 2020 a las 13:03

  • ‘status’ => ‘status’ (en caso de que te lo estés preguntando, como yo) (recién probado con php crafty tinker – llamando a Str::plural(‘status’, 2))

    – Pablo Cámara

    31 de agosto de 2022 a las 1:03

avatar de usuario de andrewtweber
andresweber

Laravel 5 y 6

La respuesta de Alpha fue para Laravel 4.

Para dar crédito donde corresponde, quería actualizar la respuesta para Laravel 5+.

Pluralizer ahora se extiende desde doctrina/inflector para evitar reinventar la rueda. Esta biblioteca contiene algunas reglas básicas, por ejemplo

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

Seguido por algunos “sin inflexiones” (es decir, singular y plural son lo mismo)

deer, fish, etc.

Y finalmente las reglas irregulares, por ejemplo

man  => men
ox   => oxen

De la documentación:

Doctrine inflector tiene métodos estáticos para flexionar texto.

Los métodos en estas clases provienen de varias fuentes diferentes recopiladas a través de varios proyectos php diferentes y varios autores diferentes. Se desconocen los nombres y correos electrónicos de los autores originales.

La implementación de Pluralizar y Singularizar se tomó prestada de CakePHP con algunas modificaciones.

Por lo tanto, es interesante cuánto se prestan y reutilizan todos los marcos entre sí.

¿Ha sido útil esta solución?