¿Qué significa "asignación masiva" en Laravel?

159

Cuando revisé la parte del tema Laravel Document sobre Eloquent ORM, obtuve un nuevo término Mass Assignment.

Mostrar documento Cómo hacer Asignación de masas y los fillableo guardedConfiguración de propiedades. Pero después de pasar por eso, no entendí claramente Mass Assignmentcómo funciona.

En mi experiencia pasada en CodeIgniter, tampoco escuché sobre este término.

¿Alguien tiene una explicación simple sobre eso?

Chen-Tsu Lin
fuente

Respuestas:

206

La asignación masiva es cuando envía una matriz a la creación del modelo, básicamente configurando un grupo de campos en el modelo de una sola vez, en lugar de uno por uno, algo así como:

$user = new User(request()->all());

(Esto es en lugar de establecer explícitamente cada valor en el modelo por separado).

Puede usar fillablepara proteger qué campos desea que esto permita realmente la actualización.

También puede bloquear la asignación masiva de todos los campos haciendo esto:

protected $guarded = ['*'];

Digamos que en su tabla de usuario tiene un campo que es user_typey que puede tener valores de usuario / administrador

Obviamente, no desea que los usuarios puedan actualizar este valor. En teoría, si usó el código anterior, alguien podría inyectar en un formulario un nuevo campo user_typey enviar 'admin' junto con los otros datos del formulario, y cambiar fácilmente su cuenta a una cuenta de administrador ... malas noticias.

Añadiendo:

$fillable = ['name', 'password', 'email'];

Se asegura de que solo esos valores se puedan actualizar utilizando mass assignment

Para poder actualizar el user_typevalor, debe establecerlo explícitamente en el modelo y guardarlo, de esta manera:

$user->user_type = 'admin';
$user->save();
duellsy
fuente
16
Gracias por esta respuesta, no entiendo quién haría algo como $user = new User(Input::all());(como programador) es tan descontrolado (o en qué escenario sería tan útil).
Kyslik
14
... no es en absoluto el punto de la respuesta, es para mantener la respuesta corta sin el secuestro como toda una lección sobre la seguridad, etc
duellsy
3
Entendí el punto y me alegro de haber encontrado esta respuesta. Solo tengo curiosidad sobre en qué escenario es útil la línea citada anteriormente (en mi comentario). Quiero decir sin validación y todo eso.
Kyslik
44
Entonces, ¿piensas en respuesta a una pregunta titulada "¿Qué significa" asignación masiva "en Laravel?" Debería haber entrado en detalles sobre la validación ... fue una respuesta simple a la pregunta sin salirse del camino. Dejemos esto como está.
duellsy
8
No importa cuál sea el punto de la pregunta de OP que hice, así que no tengo que crear un nuevo hilo, y sigues hablando de "por qué no". Simplemente no entiendo por qué alguien usaría la línea como la escribiste en lugar de$user = new User; $user->name = 'Neo';
Kyslik
26

La asignación masiva es un proceso de envío de una matriz de datos que se guardará en el modelo especificado a la vez. En general, no necesita guardar datos en su modelo uno por uno, sino más bien en un solo proceso.

La asignación masiva es buena, pero hay ciertos problemas de seguridad detrás de ella. ¿Qué pasa si alguien pasa un valor al modelo y sin protección puede modificar definitivamente todos los campos, incluida la ID? Eso no es bueno.

Digamos que usted tiene mesa "de los estudiantes, con los campos "student_type, nombre, apellido” . Es posible que desee asignar masa 'nombre, apellido', pero que desea proteger student_type de ser cambiado directamente. Ahí es donde se puede llenar y vigilado tener lugar.

Rellenable le permite especificar qué campos son asignables en masa en su modelo, puede hacerlo agregando la variable especial $fillableal modelo. Entonces en el modelo:

class Student extends Model {
      protected $fillable = ['first_name', 'last_name']; //only the field names inside the array can be mass-assign
} 

el ' tipo_estudiante ' no está incluido, lo que significa que están exentos.

Guardado es el reverso de rellenable. Si rellenable especifica qué campos se asignarán en masa, guardado especifica qué campos no son asignables en masa. Entonces en el modelo:

class Student extends Model {
      protected $guarded = ['student_type']; //the field name inside the array is not mass-assignable
}

debe usar $ fillable o $ guarded, no ambos.

Para más detalles abra el enlace: - Asignación masiva

Udhav Sarvaiya
fuente
1
Esto es sacado directamente del libro de Matt Stauffer "Laravel Up & Running"
batir
5

La asignación masiva significa que está completando una fila con más de una columna utilizando una matriz de datos. (algo así como un acceso directo en lugar de construir manualmente la matriz) usando Input::all().

Técnicamente solo desde lo alto de mi cabeza. Rellenable significa qué columnas de la tabla se pueden insertar, guardado significa que el modelo no puede insertarse en esa columna en particular.

Tenga en cuenta que cuando intenta hacer una asignación masiva con like, inserte en una columna llamada "secreto", y ha especificado que está guardado, puede intentar insertarlo a través del modelo, pero nunca se insertará realmente en la base de datos.

Esto es por seguridad y protección en su mesa cuando usa el modelo. La asignación masiva parece ser solo un aviso o advertencia de que no le dijiste al modelo que se puede rellenar y que está protegido y lo hace vulnerable a algún tipo de ataque.

majidarif
fuente
2

Esto es cuando una matriz de datos recibidos se guarda a la vez en un modelo.

Debido a los problemas de seguridad con este método en laravel, se recomienda que defina los campos que desea que los datos solicitados llenen en el Modelo.

Puede usar la $fillablevariable para definir los campos que desea completar en la tabla de la base de datos.

P.ej

Protected $fillable = [‘username’, dob’, email’,];

Cuando laravel detecta que está asignando datos en masa, lo obliga a definir los campos que desea asignar en masa en la clase de modelo.

Alguien puede pasar fácilmente datos no deseados en un formulario html a su base de datos.

Punit khandelwal
fuente