2013-08-04 2 views
23

소프트 삭제 개념을 구현하려고합니다.소프트 삭제 된 엔터티가 쿼리 결과에 나타나는 이유는 무엇입니까?

class Post extends Eloquent { 

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

    ... 

삭제 소프트에 있습니다 :

여기 내 개체입니다.

description

문제는, 내가 검색하거나 게시물을 표시 all()를 사용할 때, 소프트 삭제 : 나는 게시물을 '삭제'하면

지금, 그것은 'deleted_at'타임 스탬프를 가져옵니다 항목이 나타납니다. 뭐가 잘못 되었 니?

+1

개체를 삭제 한 위치와 페이지에서 표시 할 위치를 코드에 게시 할 수 있습니까? – msturdy

+3

고마워, 나는 이미 문제를 해결했다. 나는 Eloquent 대신 Fluent 쿼리를 사용했다. 이것은이 행동의 이유이다. –

+0

미래의 방문자 : [4.2를 사용하고 있다면 이것을 읽는다] (https://laracasts.com/ 포럼 /? p = 1766-laravel-4-2-soft-deletes-issue/0) – zehelvion

답변

20

부드러운 삭제 기능은 Eloquent를 사용할 때 작동합니다. 쿼리 작성 도구을 사용하여 결과를 쿼리하는 경우 결국 휴지통에있는 모든 레코드를 볼 수 있습니다.

그것은 Laravel 4의 현재 문서에서 명확하지 않다, 그러나 소프트 삭제의 개념은 단지 Eloquent ORM - Soft Deleting에서가 아니라 쿼리 빌더 아래에 나타나는 것을보고, 우리는 그 가정 할 수 있습니다 소프트 삭제 만 웅변 ORM와 함께 작동.

+0

Laravel의 Eloquent 영역의 문서가 처음에 어떻게 모델 이름을 언급했는지 처음으로 내 개발자가 Eloquent를 사용하여 쿼리를 작성했다고 생각했습니다. 그래서 SomeModel : join ('table2', 'column1', column2 ') 그리고 QueryBuilder 문서의 쿼리는 사용하지 않은 DB :: table을 사용했습니다. 하지만 그런 종류의 구문을 사용하여 조인을 사용하는 경우 softDeleted 데이터가 포함되므로 고통스럽게 추가해야합니다. -> whereNull ('table1.deleted_at') -> whereNull ('table2.deleted_at') 내 쿼리에서 별도의 아카이빙 테이블/스키마에 넣기위한 SoftDeletes 플러그인이 있음) – armyofda12mnkeys

0

내가

Post::all() 

내가 잘 작동

을 사용하여, 나는 그것이 (deleted_at 타임 스탬프 플래그 항목) 소프트 삭제 된 항목을 반환하지 않는 것을 의미한다. 나는 Laravel 4를 사용하고있다.

34

간혹 get()protected $softDelete = true; 이어도 soft deleted 테이블 항목을 가져올 수있다.

그래서,이 문제를 방지

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

예를 들어,이 쿼리는 소프트 삭제를 포함한 모든 행을 가져옵니다 사용할 수 있습니다.

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

그래서 적절한 방법은

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에서 테이블 및 쿼리를 삭제 소프트를 사용하여 약간의 트릭이있다 :

우리가

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

같은 것을 만들 시스템은 다음과 같이 실행합니다 :

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

지금까지 그렇게 좋았습니다.deleted_at가 null로하는 곳 새 쿼리는 모든 자동차를 반환합니다

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

: 우리는 "orWhere"방법을 적용 할 때, 뭔가 재미는 그런 일을 실행합니다

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

시스템을 발생 delete_at가 null이 아닌 경우에도 색상은 파란색이거나 색상이 빨간색입니다.

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

당신은 폐쇄를 통과하는 "경우"방법을 변경해야합니다,이 문제에서 탈출 : 더 명시 적으로 문제를 보여 무엇이 다른 쿼리의 동일한 동작이다. 그와 마찬가지로 :

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

그런 다음, 시스템이 그런 일을 실행합니다 :

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

이 마지막 쿼리, deleted_at가 null 어디 색상이 될 수 있습니다 또는 빨간색 또는 파란색 모든 자동차 검색, 우리가 원하는대로.

+0

이것은 훨씬 더 포괄적 인 대답입니다. –

3

나는 똑같은 문제가 있었고 여기서 어떤 도움도되지 않았습니다. 사람을 도와

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

    //Rest of my code 
} 

희망 :

내 문제는 내 구조에, 나는 부모의 생성자를 호출하는 것을 잊었다했다!