Buscar..
Haciendo un modelo
Creación de modelos
Las clases de modelo deben extender Illuminate\Database\Eloquent\Model
. La ubicación predeterminada para los modelos es el directorio /app
.
El comando Artesano puede generar fácilmente una clase modelo:
php artisan make:model [ModelName]
Esto creará un nuevo archivo PHP en la app/
por defecto, que se llamará [ModelName].php
, y contendrá todo el texto de su nuevo modelo, que incluye la clase, el espacio de nombres y los usos necesarios para una configuración básica.
Si desea crear un archivo de migración junto con su Modelo, use el siguiente comando, donde -m
también generará el archivo de migración:
php artisan make:model [ModelName] -m
Además de crear el modelo, esto crea una migración de base de datos que está conectada al modelo. El archivo PHP de migración de la base de datos se encuentra por defecto en la database/migrations/
de database/migrations/
. De manera predeterminada, esto no incluye nada más que las columnas id y created_at
/ updated_at
, por lo que deberá editar el archivo para proporcionar columnas adicionales.
Tenga en cuenta que tendrá que ejecutar la migración (una vez que haya configurado el archivo de migración) para que el modelo comience a funcionar utilizando php artisan migrate
desde la raíz del proyecto
Además, si desea agregar una migración más adelante, después de hacer el modelo, puede hacerlo ejecutando:
php artisan make:migration [migration name]
Digamos, por ejemplo, que quería crear un modelo para sus gatos, tendría dos opciones, crear con o sin migración. Elegiría crear sin migración si ya tenía una tabla de gatos o no quería crear una en este momento.
Para este ejemplo, queremos crear una migración porque todavía no tenemos una tabla, así que ejecutaríamos el siguiente comando.
php artisan make:model Cat -m
Este comando creará dos archivos:
- En la carpeta de
app/Cat.php
:app/Cat.php
- En la carpeta de la base de datos:
database/migrations/timestamp_creat_cats_table.php
El archivo en el que estamos interesados es el último, ya que es este archivo en el que podemos decidir cómo queremos que se vea e incluya la tabla. Para cualquier migración predefinida se nos da una columna de ID de incremento automático y columnas de marcas de tiempo.
El siguiente ejemplo de un extracto del archivo de migración incluye las columnas predefinidas anteriores, así como la adición del nombre del gato, la edad y el color:
public function up()
{
Schema::create('cats', function (Blueprint $table) {
$table->increments('id'); //Predefined ID
$table->string('name'); //Name
$table->integer('age'); //Age
$table->string('colour'); //Colour
$table->timestamps(); //Predefined Timestamps
});
}
Como puede ver, es relativamente fácil crear el modelo y la migración para una tabla. Luego, para ejecutar la migración y crearla en su base de datos, ejecutará el siguiente comando:
php artisan migrate
Lo que migrará cualquier migración pendiente a su base de datos.
Ubicación del archivo de modelo
Los modelos se pueden almacenar en cualquier lugar gracias a PSR4 .
Por defecto, los modelos se crean en el directorio de la app
con el espacio de nombres de la App
. Para aplicaciones más complejas, generalmente se recomienda almacenar los modelos dentro de sus propias carpetas en una estructura que tenga sentido para la arquitectura de sus aplicaciones.
Por ejemplo, si tenía una aplicación que utilizaba una serie de frutas como modelos, podría crear una carpeta llamada app/Fruits
y dentro de esta carpeta, crea Banana.php
(manteniendo la convención de nombres de StudlyCase ), luego puede crear la clase Banana. en el espacio de nombres de App\Fruits
:
namespace App\Fruits;
use Illuminate\Database\Eloquent\Model;
class Banana extends Model {
// Implementation of "Banana" omitted
}
Configuración del modelo
Elocuente sigue un enfoque de "convención sobre configuración". Al ampliar la clase de Model
base, todos los modelos heredan las propiedades que se enumeran a continuación. A menos que se invalide, se aplican los siguientes valores predeterminados:
Propiedad | Descripción | Defecto |
---|---|---|
protected $connection | Nombre de conexión DB | Conexión DB predeterminada |
protected $table | Nombre de la tabla | De forma predeterminada, el nombre de la clase se convierte a snake_case y se pluraliza. Por ejemplo, SpecialPerson convierte en special_people |
protected $primaryKey | Tabla PK | id |
public $incrementing | Indica si las ID son auto-incrementales | true |
public $timestamps | Indica si el modelo debe tener la marca de tiempo. | true |
const CREATED_AT | Nombre de la columna de marca de tiempo de creación | created_at |
const UPDATED_AT | Nombre de la columna de marca de tiempo de modificación | updated_at |
protected $dates | Atributos que deben mutarse a DateTime, además de los atributos de marca de tiempo | [] |
protected $dateFormat | Formato en el que se conservarán los atributos de fecha. | Por defecto para el dialecto SQL actual. |
protected $with | Relaciones a eagerload con modelo. | [] |
protected $hidden | Atributos omitidos en la serialización del modelo | [] |
protected $visible | Atributos permitidos en la serialización del modelo. | [] |
protected $appends | Atributos de acceso añadido a la serialización del modelo. | [] |
protected $fillable | Atributos que son asignables en masa | [] |
protected $guarded | Atributos que están en la lista negra de la asignación en masa | [*] (Todos los atributos) |
protected $touches | Las relaciones que se deben tocar en guardar. | [] |
protected $perPage | El número de modelos a devolver por paginación. | 15 |
Propiedad | Descripción | Defecto |
---|---|---|
protected $casts | Atributos que deben ser convertidos a tipos nativos | [] |
Actualizar un modelo existente
$user = User::find(1);
$user->name = 'abc';
$user->save();
También puede actualizar varios atributos a la vez usando la update
, que no requiere usar save
después:
$user = User::find(1);
$user->update(['name' => 'abc', 'location' => 'xyz']);
También puede actualizar un modelo (s) sin consultarlo de antemano:
User::where('id', '>', 2)->update(['location' => 'xyz']);
Si no desea activar un cambio en la marca de tiempo updated_at
en el modelo, puede pasar la opción touch
:
$user = User::find(1);
$user->update(['name' => 'abc', 'location' => 'xyz'], ['touch' => false]);