Pourquoi supprimée entités apparaissent dans les résultats de recherche?

j'essaie d'implémenter le concept de suppression douce.

Voici mon objet:

class Post extends Eloquent {

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'posts';
    protected $softDelete = true;

    ...

Doux supprimer est sur.

Maintenant, si je supprimer un post, il obtient un 'deleted_at' timestamp:

description

le problème est, quand je cherche ou juste utiliser all() pour afficher les messages, les éléments supprimés logiciel s'affiche. Quel est le problème?

24
demandé sur Anax 2013-08-04 12:31:28

5 réponses

doux suppression la fonctionnalité fonctionne quand on utilise Eloquent. Si vous interrogez les résultats avec Query builder vous verrez éventuellement tous les enregistrements détruits et non détruits.

il n'est pas clair dans les docs actuels de Laravel 4, mais de voir que le concept de doux suppression apparaît sous Éloquent ORM - Soft Suppression et pas sous Query Builder, nous pouvons seulement supposer que:doux supprimer ne fonctionne qu'avec Éloquent ORM.

21
répondu Rubens Mariuzzo 2016-02-23 19:39:32

Parfois, vous aurez l' soft deleted entrées de tableau avec get() même avec éloquence et protected $softDelete = true;.

Donc pour éviter ce problème, utilisez

...->whereNull('deleted_at')->get();

Par exemple, cette requête va chercher toutes les lignes, y compris supprimée.

DB::table('pages')->select('id','title', 'slug')
                                   ->where('is_navigation','=','yes')
                                   ->where('parent_id','=',$parent_id)
                                   ->orderBy('page_order')
                                   ->get();

donc la bonne méthode est,

DB::table('pages')->select('id','title', 'slug')
                                   ->where('is_navigation','=','yes')
                                   ->where('parent_id','=',$parent_id)
                                   ->whereNull('deleted_at')
                                   ->orderBy('page_order')
                                   ->get();
36
répondu devo 2013-10-21 16:04:57

il y a un petit truc en utilisant des tables de suppression et des requêtes dans laravel:

quand nous créons quelque chose comme

$objCars = Car::where("color","blue");

Le système exécute quelque chose comme ça:

SELECT
  *
FROM
  cars
WHERE
  deleted_at IS NULL
AND
  "color" = 'blue'

jusqu'ici, tout va bien. Mais, quand nous appliquons la méthode "orWhere", quelque chose de drôle se produit

$objCars = Car::where("color","blue")->orWhere("color","red");

Le système exécutera quelque chose comme ça:

SELECT 
  * 
FROM
  cars
WHERE
  deleted_at IS NULL 
AND 
  "color" = 'blue'
OR
  "color" = 'red'

cette nouvelle requête retournera toute la voiture où deleted_at est null et la couleur est bleue ou si la couleur est rouge, même si la deleted_at n'est pas nulle. C'est le même comportement de cette autre requête, ce qui montre le problème plus explicitement:

SELECT 
  * 
FROM
  cars
WHERE
  (
    deleted_at IS NULL 
  AND 
    "color" = 'blue'
  )
OR
  "color" = 'red'

pour échapper à ce problème, vous devriez changer la méthode "où" passant une fermeture. Comme ça:

$objCars = Car::where(
  function ( $query ) {
    $query->where("color","blue");
    $query->orWhere("color","red");
  }
);

Ensuite, le système exécutera quelque chose comme ça:

SELECT
  *
FROM
  cars
WHERE
  deleted_at IS NULL
AND
  (
    "color" = 'blue' 
  OR
    "color" = 'red'
  )

cette dernière requête, recherche toutes les voitures où deleted_at est null et où la couleur peut être rouge ou bleu, comme nous le voulions faire.

27
répondu Thiago Mata 2015-04-17 20:10:46

j'ai eu le même problème et rien qui ne m'a aidé.

Mon problème était dans ma construction, j'ai oublié d'appeler le constructeur parent:

public function __construct()
{
   parent::__construct();

   //Rest of my code
}

j'Espère que d'aider quelqu'un!

3
répondu William Perron 2016-10-19 23:53:48

j'utilise

Post::all()

je fonctionne très bien, je veux dire qu'il ne reprend pas le soft éléments supprimés (articles marqués avec deleted_at horodateurs). J'utilise Laravel 4.

0
répondu Chris J Kikoti 2013-10-04 07:51:07