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:
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?
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.
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();
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.
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!
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.