32
loading...
This website collects cookies to deliver better user experience
insert()
y un create()
, como recordaremos, el primero ejecuta una instrucción sql que coloca los datos directamente dentro de nuestra tabla, mientras que el segundo crea una instancia de un modelo eloquent, lo que nos resulta bastante útil al momento de querer seguir usando esta información para ejecutar alguna otra lógica dentro de nuestra aplicación.DB
:DB::table('dogs')->insert(['name' => 'Old Yeller', 'age' => 12]); // result "true"
$dog = Dog(); // result "App\Models\Dog"
$dog->name = 'Just-right Yeller'; // result "Just-right Yeller"
$dog->age = 6; // result 6
$dog->save(); // result "true"
save()
que proporciona eloquent, para ello, debemos asignar los valores a cada propiedad de nuestro modelo y ejecutar el método, esto actuará de la misma manera que el insert
de arriba, persistiendo nuestros datos, pero con el plus de tener una instancia de nuestro modelo, lo que nos permitirá trabajar con este registro de una manera más cómoda, pudiendo hacer casi cualquier cosa con ella. Sin embargo, podemos ver que acá trabajamos con una especie de enfoque híbrido, hemos creado una instancia del modelo, luego establecimos los atributos, para finalmente guardarlo, a grandes rasgos podríamos decir que fueron tres pasos ejecutados, veamos una tercera forma de guardar nuestra información con menos instrucciones:Dog::create(['name' => 'Young Yeller', 'age' => 3]);
exception
: "Illuminate\Database\Eloquent\MassAssignmentException con el mensaje 'name'" - ¿MassAssignmentException, de qué se trata?$fillable
y $guard
entran al juego. Eloquent, en su grandiosa misión de facilitarnos el manejo de información desde y hacia la base de datos, no solo nos proporciona métodos y propiedades para este particular, además, no brinda apoyo en cuanto a la protección en la ejecución de estas tareas, al garantizar que solo se inserten o actualicen los campos que se desean rellenar y nada más, para ello, en primer lugar tenemos a la propiedad $fillable
, la cual es una especie de lista blanca, en la cual le indicamos cuales son los campos de nuestra base de datos que puede guardar a través de la asignación en masa. En segundo lugar, tenemos $guard
la cual es todo lo contrario, en ella indicamos aquellos que deseamos proteger y que solo podrán ser asignados de manera directa (como en el segundo ejemplo usando save()).protected $fillable = ['name'];
Dog::create(['name' => 'Young Yeller', 'age' => 3]);
$fillable
que podía permitir la asignación de este campo. Este es un error muy común y de los que muchas veces tardamos en darnos cuenta debido a que en realidad no existe ninguna señal de error que así no los indique, por lo que podríamos pasar horas quebrándonos la cabeza buscando el motivo por el cual nuestros datos no persisten, muchos podrán pensar que esto es una desventaja e incluso algunos tratarían de evitar el uso de este método, sin embargo, debemos tomar en cuenta que esto es así por una razón, la ‘inyección de SQL’, de esta manera, aunque cualquier atacante intente y logre agregar campos no definidos por nosotros, estos no afectarán a nuestra aplicación puesto que serán ignorados por Eloquent.La inyección de sql es un tipo de ataque muy común en la web, si quieres saber un poco más sobre ello, puedes hacerlo en el link: Inyección de SQL
$dog = new Dog (['name' => 'Young Yeller', 'age' => 3]); // result App\Models\Dog {#690 name: "Young Yell
save()
desde nuestra instancia.new
solo creamos una instancia del modelo, nada distinto a una simple creación de instancia desde php puro $dog = new Dog($data)
. Por su parte, Create
también crea una instancia del modelo con la distinción de que además persiste en la base de datos la información contenida en la instancia, o lo que se podría traducir en $dog= (new Dog($data))->save()
, en este sentido, podemos decir que:>>> $dog = Dog::findOrNew(100)
=> App\Models\Dog {#4061}
// Si existe lo devuelve
>>> $dog = Dog::firstOrNew(['name' => 'Jock'])
=> App\Models\Dog {#4284
id: 2,
name: "Jock",
gender: "male",
age: 7,
created_at: "2021-06-07 02:05:46",
updated_at: "2021-06-07 02:05:46",
deleted_at: null,
}
// Si no existe crea la instancia
>>> $dog = Dog::firstOrNew(['name' => 'Champ'])
=> App\Models\Dog {#3333
name: "Champ",
}
>>> $dog = Dog::firstOrCreate(['name' => 'Champ'])
=> App\Models\Dog {#4282
name: "Champ",
updated_at: "2021-06-27 15:26:41",
created_at: "2021-06-27 15:26:41",
id: 6,
}
>>> Dog::find(6)
=> App\Models\Dog {#4287
id: 6,
name: "Champ",
gender: null,
age: null,
created_at: "2021-06-27 15:26:41",
updated_at: "2021-06-27 15:26:41",
deleted_at: null,
}
updateOrCreate()
. Esta función nos permite concluir una búsqueda de varias partes con una instrucción de inserción o de actualización dependiendo de su resultado. Por ejemplo:Dog::updateOrCreate(['id' => 1, 'name' => 'Joe'], ['age' => 15]);
Dog::updateOrCreate(['id' => 2, 'name' => 'Joe'], ['age' => 15]);