= CodeIgniter v4 Model {{tag>codeigniter}} * conexión automática a BDD * métodos CRUD básicos * permite extender de otros modelos == instanciar // Create a new class manually. $userModel = new \App\Models\UserModel(); // Create a shared instance of the model. $userModel = model('UserModel'); // or $userModel = model('App\Models\UserModel'); // or $userModel = model(\App\Models\UserModel::class); // Create a new class with the model() function. $userModel = model('UserModel', false); // Create shared instance with a supplied database connection. $db = db_connect('custom'); $userModel = model('UserModel', true, $db); == propiedades built-in * ''$DBGRoup'': conexión alternativa a la BDD en lugar de la establecida por defecto.[[https://codeigniter.com/user_guide/models/model.html#connecting-to-the-database|connecting]] * ''$table'': tabla primaria, solo aplica en los métodos básicos de CRUD * ''$primaryKey'' * ''$useAutoIncrement = true'': poner a **false** si se ha delegado en la BDD * ''$returnType = 'array''': retorno de ''find()'', array o object * ''$useSoftDeletes = true;'': si cierto, actualiza el campo **deleted_at** * ''withDeleted()'' * ''$allowedFields'': campos permitidos en los métodos básicos CRUD * ''save()'',''insert()'',''update()'' * la ''$primaryKey'' no ha de estar en esta lista * ''$allowEmptyInserts'': Si **true** lanzará excepción en caso de insert vacío * ''$updateOnlyChanged'': Si **true** lanzará excepción en caso de que no haya nada que actualizar * ''$casts'': forzar un cast de variables después de recuperar de la BDD * [[https://codeigniter.com/user_guide/models/model.html#model-field-casting]] * no usar en conjunto con [[entity|]] * Dates: * ''$useTimestamps = false;'' * ''$dateFormat = 'datetime';'': valores permitidos: **datetime**, **date**, **int** * ''$createdField = 'created_at';'' * ''$updatedField = 'updated_at';'' * ''$deletedField = 'deleted_at';'' * Validacions: * ''$validationRules = [];'' * [[https://codeigniter.com/user_guide/libraries/validation.html#validation-array]] * [[https://codeigniter.com/user_guide/models/model.html#model-setting-validation-rules]] * ''$validationMessages = [];'' * [[https://codeigniter.com/user_guide/libraries/validation.html#validation-custom-errors]] * ''$skipValidation = false;'' * ''$cleanValidationRules = true;'' * ''cleanRules()'' * ??? * Callbacks * ''$allowCallbacks = true;'' * ''$beforeInsert = [];'' * ''$afterInsert = [];'' * ''$beforeInsertBatch = [];'' * ''$afterInsertBatch = [];'' * ''$beforeUpdate = [];'' * ''$afterUpdate = [];'' * ''$beforeUpdateBatch = [];'' * ''$afterUpdateBatch = [];'' * ''$beforeFind = [];'' * ''$afterFind = [];'' * ''$beforeDelete = [];'' * ''$afterDelete = [];'' === casts * protected array $casts = [ 'id' => 'int', 'birthdate' => '?datetime', 'hobbies' => 'json-array', 'active' => 'int-bool', ; * Data Types: [[https://codeigniter.com/user_guide/models/model.html#data-types]] * **csv** usa ''implode()'' y ''explode()'' * **datetime**: formato configurado en el campo **dateFormat** de [[https://codeigniter.com/user_guide/database/configuration.html#database-config-explanation-of-values]] * Un **?** delante del campo indica que puede ser **NULL** * [[https://codeigniter.com/user_guide/models/model.html#custom-casting]] == métodos built-in * ''initialize()'': se ejecuta después del constructor para personalizar.[[https://codeigniter.com/user_guide/models/model.html#initialize|initialize]] * ''find($primaryKey | [$primaryKey,$primaryKey,...])'': * retorna la fila (o filas) de las primaryKey indicadas (array si más de una) * si no se especifica valor, retorna todas las filas. * ''findColumn()'': retorna los valores de una coliumna * ''findAll()'': retorna todos los valores (si hay criterios restrictivos, los aplica) * ''findAll($limit,$offset)'' * ''first()'': solo retorna el primer registro * ''withDeleted()'' * ''asArray()'' ''asObject()'' <- Entity * ''insert($data[,$bool])'' * $data: array de valores de campos * $bool: si **false**, retorna un bool con el resultado de la operación * ''getInsertID()'' * ''allowEmptyInserts()''[[https://codeigniter.com/user_guide/models/model.html#model-allow-empty-inserts]] * ''insertBatch()'' * $useAutoIncrement = false * ''update($primaryKey,$data)'' * permite actualizar varias filas a la vez [[https://codeigniter.com/user_guide/models/model.html#update]] * ''save($data)'': decide si hacer insert() o update() en función de si el array contiene un campo equivalente a la de la $primaryKey * instancias de ''Time'' se convierten en cadenas con el formato definido en dateFormat['datetime'],dateFormat['date'] dentro de [[https://codeigniter.com/user_guide/database/configuration.html#database-config-explanation-of-values]] * los métodos ''save'' comprueban la validez de la $primaryKey * [[https://codeigniter.com/user_guide/models/model.html#primary-key-validation]] * ''validateID()'' * ''delete($primaryKey,[$primaryKey,$primaryKey,...])'' * con ''$useSoftDeletes=true'', se actualiza la columna indicada en ''$deletedField'' * ''purgeDeleted()'' * ''chunk()'': para procesar un gran volumen de datos de manera fraccionada == in-Model Validation * verificar antes de guardar que cumple los requisitos indicados * usa la propiedad ''$validationRules'' (y complementa con ''$validationMessages'': protected $validationRules = [ 'username' => 'required|max_length[30]|alpha_numeric_space|min_length[3]', 'email' => 'required|max_length[254]|valid_email|is_unique[users.email]', 'password' => 'required|max_length[255]|min_length[8]', 'pass_confirm' => 'required_with[password]|max_length[255]|matches[password]', ]; protected $validationMessages = [ 'email' => [ 'is_unique' => 'Sorry. That email has already been taken. Please choose another.', ], ]; * ''setValidationRule($campo,$reglas)'' y su complemento ''setValidationMessage($campo,$array)'' * ''setValidationRules([$campo=>$reglas,$campo=>$reglas])'' y su complemente ''setValidationMessages([$campo=>$array])'' * si no valida, el Modelo retorna **false**. Se pueden recuperar los errores con el método ''errors()'' * ''getValidationRules($options)'' * $options: array con 2 claves, **except** o **only** para recoger las reglas de validación indicadas * también se puede indicar un grupo de reglas de validaciones [[https://codeigniter.com/user_guide/libraries/validation.html#saving-validation-rules-to-config-file]] === placeholders * [[https://codeigniter.com/user_guide/libraries/validation.html#rules-for-general-use]] * [[https://codeigniter.com/user_guide/libraries/validation.html#validation-available-rules]] * ''is_unique'' * ''is_unique[tabla.campo,id,{id}'' único campo para el id={id} (si es el campo $primaryKey) * ''alpha*'', ''string'' * ''field_exists'' * ''in_list'', ''not_in_list'' * ''max_length'', ''min_length'', ''exact_length'' * ''permit_empty'' * ''required'',''required_with'',''required_without'' * ''valid_email'',''valid_emails'' * ''valid_date'' * ''valid_json'' == protecting Fields * ''$allowedFields'' * ''protect(true|false)'' == Callbacks * [[https://codeigniter.com/user_guide/models/model.html#defining-callbacks]] * ''allowCallbacks(false)'' == crear namespace App\Models; use CodeIgniter\Model; class UserModel extends Model { // ... } ==