Tengo una intersección en mi método de actualización:
$inputs = $request->intersect('message','name','email','is_read');Si envío una solicitud de actualización donde is_read=0, la intersección devuelve una matriz vacía. Funciona bien con cualquier otra cosa (falso, 1, etc.)
¿Algun consejo?
¡Gracias!
ALERTA Intente pasar a otra implementación y deje de usar el método intersect() , se eliminará de las futuras versiones de Laravel: Enlace
SI quiere decir que falta la clave is_read en la matriz final (y no que toda la matriz está vacía, vea mi comentario), esto se debe a la implementación del método intersect() .
El método intersect simplemente envuelve el método only() de la clase Illuminate\Http\Request y realiza un array_filter sobre el resultado.
Esta es la implementación:
/** * Intersect an array of items with the input data. * * @param array|mixed $keys * @return array */ public function intersect($keys) { return array_filter($this->only(is_array($keys) ? $keys : func_get_args())); }En su caso, podemos descomponer el código así:
paso 1
$results = $request->only('message','name','email','is_read'); En este punto, $results es
Array ( [message] => message [name] => name [email] => email [is_read] => 0 )Sin embargo, en el paso 2
paso 2
$filteredResults = array_filter($results);El resultado se convierte
Array ( [message] => message [name] => name [email] => email ) Y esto se debe a cómo funciona array_filter . Espera una matriz como primer parámetro, luego una devolución de llamada opcional (utilizada para filtrar la matriz) y una bandera.
¿Qué sucede cuando no se proporciona devolución de llamada (como en este caso?)
Si no se proporciona una devolución de llamada, se eliminarán todas las entradas de la matriz iguales a FALSO (ver conversión a booleano ).
Si observa el enlace que se convierte en booleano , verá que se supone que 0 (cero) es FALSO y, por ese motivo, se elimina de la matriz.