varios unir una subconsultas puro otra dentro consultas consulta laravel laravel-4 eloquent soft-delete

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.