laravel - unir - ¿Por qué aparecen las entidades eliminadas en los resultados de las consultas?
unir consultas laravel (5)
A veces, obtendrá las entradas de la tabla soft deleted
con get()
incluso con eloquent y protected $softDelete = true;
.
Para evitar este problema, use
...->whereNull(''deleted_at'')->get();
Por ejemplo, esta consulta obtendrá todas las filas, incluida la eliminación de software.
DB::table(''pages'')->select(''id'',''title'', ''slug'')
->where(''is_navigation'',''='',''yes'')
->where(''parent_id'',''='',$parent_id)
->orderBy(''page_order'')
->get();
Entonces, el método correcto es
DB::table(''pages'')->select(''id'',''title'', ''slug'')
->where(''is_navigation'',''='',''yes'')
->where(''parent_id'',''='',$parent_id)
->whereNull(''deleted_at'')
->orderBy(''page_order'')
->get();
Estoy tratando de implementar un concepto de eliminación de software.
Aquí está mi objetivo:
class Post extends Eloquent {
/**
* The database table used by the model.
*
* @var string
*/
protected $table = ''posts'';
protected $softDelete = true;
...
La eliminación suave está activada.
Ahora, si ''borro'' una publicación, obtiene una marca de tiempo ''deleted_at'':
El problema es que cuando busco o uso all()
para mostrar las publicaciones, los elementos eliminados de software aparecen allí. ¿Qué está mal?
Hay un pequeño truco usando tablas y consultas de eliminación suave en laravel:
Cuando creamos algo así como
$objCars = Car::where("color","blue");
El sistema ejecuta algo como eso:
SELECT
*
FROM
cars
WHERE
deleted_at IS NULL
AND
"color" = ''blue''
Hasta aquí todo bien. Pero, cuando aplicamos el método "orWhere", sucede algo gracioso
$objCars = Car::where("color","blue")->orWhere("color","red");
El sistema ejecutará algo así:
SELECT
*
FROM
cars
WHERE
deleted_at IS NULL
AND
"color" = ''blue''
OR
"color" = ''red''
Esta nueva consulta devolverá todo el automóvil donde deleted_at es nulo y el color es azul O si el color es rojo, incluso si el deleted_at no es nulo. Es el mismo comportamiento de esta otra consulta, lo que muestra el problema más explícitamente:
SELECT
*
FROM
cars
WHERE
(
deleted_at IS NULL
AND
"color" = ''blue''
)
OR
"color" = ''red''
Para escapar de este problema, debe cambiar el método "dónde" pasando un Cierre. Como eso:
$objCars = Car::where(
function ( $query ) {
$query->where("color","blue");
$query->orWhere("color","red");
}
);
Entonces, el sistema ejecutará algo así:
SELECT
*
FROM
cars
WHERE
deleted_at IS NULL
AND
(
"color" = ''blue''
OR
"color" = ''red''
)
Esta última consulta busca todos los automóviles donde deleted_at es nulo y el color puede ser rojo o azul, como queríamos que hiciera.
La función de borrado suave funciona cuando se usa Eloquent. Si consulta los resultados con el generador de consultas , eventualmente verá todos los registros borrados y no destruidos.
No está claro en los documentos actuales de Laravel 4, pero viendo que el concepto de borrado suave simplemente aparece en ORM Eloquent - Borrado suave y no en Query Builder, solo podemos asumir que: soft delete solo funciona con Eloquent ORM .
Tuve el mismo problema y nada aquí me ayudó.
Mi problema estaba en mi construcción, olvidé llamar al constructor padre:
public function __construct()
{
parent::__construct();
//Rest of my code
}
Espero que ayudes a alguien!
yo suelo
Post::all()
Funciono bien, me refiero a que no devuelve elementos blandos eliminados (elementos marcados con marcas de tiempo deleted_at). Estoy usando Laravel 4.