2013-08-04 19 views
23

Yumuşak silme kavramını uygulamaya çalışıyorum.Sorgu sonuçlarında neden yumuşak silinen varlıklar görünüyor?

class Post extends Eloquent { 

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

    ... 

silme Yumuşak açıktır:

İşte benim nesnedir.

description

sorun şu ki, arama ya da sadece mesajları görüntülemek için all() kullandığınızda, yumuşak silindi: Bir yayını 'delete' eğer

Şimdi, bu bir 'deleted_at' damgası alır öğeler orada görünür. Yanlış olan ne?

+1

Nesneleri sildiğiniz yeri ve sayfada görüntülemelerini istediğiniz yeri yazdırabilir misiniz? – msturdy

+3

teşekkürler, sorunu zaten çözdüm ... Eloquent yerine Fluent sorguları kullanıyordum, bu davranışın sebebi buydu –

+0

Gelecekteki ziyaretçiler için: [4.2 kullanıyorsanız bunu okuyun] (https://laracasts.com/ forum /? p = 1766-laravel-4-2-soft-siler-issue/0) – zehelvion

cevap

20

yumuşak silme işlemi Eloquent kullanıldığında çalışır. Eğer sonuçları sorgu oluşturucu ile sorgulıyorsanız, sonunda tüm kayıtların çöpe atılıp çöpe atılmadığını göreceksiniz.

O laravel 4 mevcut dokümanlarında açık değildir, ama yumuşak silme kavramı sadece Eloquent ORM - Soft Deleting altında olup Query Builder altında göründüğünü görme, sadece varsayabiliriz: yumuşak silmek sadece Etkili ORM ile çalışır.

+0

Orijinal olarak benim devlerimin Eloquent'i kullandığını düşündüm, ilk olarak söz konusu soruyu soruyoruz. Yani: SomeModel: ('table2', 'column1', 'column2') ve QueryBuilder belgelerinde kullanılan sorguları özel olarak kullanmadığımız DB :: tablosuna katılın. Ama eğer bu tür bir sözdizimini kullanarak birleşim kullanırsanız, o zaman yine de yumuşak bir şekilde eklenmiş veriyi içerecektir, bu yüzden ağrılı bir şekilde eklemek zorunda kaldım -> WhereNull ('table1.deleted_at') -> WhereNull ('table2.deleted_at') sorgularımda ayrı arşivleme tablolarına/şemaya yerleştirmek için alternatif bir SoftDeletes eklentisi vardı) – armyofda12mnkeys

0

Ben

Post::all() 

Ben iyi çalışır

kullanmak, bunu (deleted_at damgaları ile işaretlenen öğeler) yumuşak silinmiş öğeleri döndürmez demek. Ben Bazen

34

laravel 4. kullanıyorum, hatta anlamlı ve protected $softDelete = true; ile get() ile soft deleted tablo girdileri alacak.

Yani, bu sorunu önlemek

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

Örneğin, bu sorgu yumuşak silinmiş dahil tüm satırları alıp bunu kullanmak.

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

Yani doğru yöntem

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

laravel tabloları ve sorguları silmek yumuşak kullanarak küçük bir hile yok, geçerli:

biz

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

gibi bir şey yaratmak Sistem şu gibi bir şey yürütür:

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

Şimdiye kadar, çok iyi.deleted_at null ve burada yeni sorgu tüm araba dönecektir

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

: Biz "orWhere" yöntemini uygulamak Fakat, komik bir şey böyle bir şey çalıştırır

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

sistem olur renk mavi renktedir VEYA renk kırmızıysa, delete_at boş değilse bile.

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

Bir Closure'u geçen "nerede" yöntemini değiştirmek gerekir, bu soruna kaçmak için: Daha açık bir şekilde sorunu ne gösterecek bu diğer sorgunun aynı davranış vardır. Bunun gibi:

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

Sonra, sistem böyle bir şey yürütür:

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

Bu son sorgu, deleted_at geçersiz ve nerede renk olabilir veya kırmızı ya da mavi tüm arabalar için arar istediğimiz gibi.

+0

Bu daha iyi ve kapsamlı bir yanıttır. –

3

Aynı problem vardı ve burada hiçbir şey bana yardım etmedi. Birine yardım

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

    //Rest of my code 
} 

Umut:

Benim sorun benim yapı içinde, ben üst yapıcısı aramayı unuttum oldu!

İlgili konular