2016-05-31 1 views
2

TLDR : SoftDeletes 특성이 부모 모델에 포함되어있는 경우 상위 모델의 소프트 삭제 된 인스턴스를 더 이상 자식의 동적 속성으로 가져 오지 않습니다. 어떻게 할 수 있습니까?모델의 SoftDeletes가 동적 속성을 깨뜨림


나는 다음과 같이 기본 모델의 몇 가지 정의 :

내 컨트롤러에서
<?php 
namespace App; 

use Illuminate\Database\Eloquent\Model; 
use Illuminate\Database\Eloquent\SoftDeletes; 
use Illuminate\Database\Eloquent\Builder; 

class User extends Model 
{ 
    use SoftDeletes; 

    public function posts() 
    { 
     return $this->hasMany("App\Post"); 
    } 
} 

class Post extends Model 
{ 
    public function user() 
    { 
     return $this->belongsTo("App\User"); 
    } 

    public function scopePending(Builder $query) 
    { 
     return $query->whereNull("pending"); 
    } 
} 

, 나는 게시물 보류 나열 할, 그래서 내가 할이 :

<?php 
namespace App\Controllers; 

use App\Post; 

class PostController extends Controller 
{ 

    public function index() 
    { 
     $posts = Post::pending()->get(); 
     return view("post.index", ["pending"=>$posts]); 
    } 
} 

그리고 마침내 내 견해로는 :

@foreach($pending as $post) 
    {{ $post->title }}<br/> 
    {{ $post->user->name }}<br/> 
@endforeach 

티 결과가 예외로 던져지며, "비 객체의 속성을 얻으려고 시도 중"이라는 결과가 나옵니다. 소프트 삭제 된 사용자의 경우 $post->user->name을 출력하려고합니다.

이러한 동적 속성에는 소프트 삭제 된 항목이 포함될 수 있습니까?

답변

5

분명히 관련 사용자 모델이 소프트 삭제되었으므로 관련 사용자가로드되지 않습니다.

아래 코드처럼 관계를 정의하고이 삭제 소프트 또는되지 않은 경우에 관계없이 항상 사용자를 가져올 수 있습니다 :

public function user() 
{ 
    return $this->belongsTo("App\User")->withTrashed(); 
} 
0

당신이

public function user() 
{ 
    return $this->belongsTo("App\User")->withTrashed(); 
} 
그렇게 불행하게도 경우

동적 액세스는 관계 메소드가 BelongsTo 인스턴스를 반환하고 belongsTo 메서드가 Eloquent 클래스로 반환되기 때문에 더 이상 사용자 관계에 대한 동적 액세스를 사용할 수 없습니다. 그러나 withTrashedBuilder 인스턴스를 반환합니다. 내가 잘못했다

편집, 감사 @patricius (주석) 옳은 길을 안내하고합니다.

+1

정확하지 않습니다. $ this-> belongsTo ("App \ User")'는 'BelongsTo' 객체를 반환합니다. 'BelongsTo' 객체에서'withTrashed()'를 호출하면 확장 된'Relation' 객체의'__call()'메소드로 넘어갑니다. '__call()'메쏘드는 기본'Builder' 객체에서'withTrashed()'를 호출하지만'BelongsTo' 객체를 원래의 호출자에게 돌려줍니다. 그러므로'$ this-> belongsTo ("App \ User") -> withTrashed();'는'BelongsTo' 객체를 반환 할 것입니다. – patricus

+0

@patricus, 설명 주셔서 감사합니다, 지금 무엇을 해야할지 모르겠습니다. 내 대답을 편집/삭제하거나 그대로 유지해야합니까? – huuuk

+0

당신에게 달려 있습니다. 주석은 유용한 정보를 제공하지만 일부 사람들은 주석을 작성하지 않고 답을 읽지 않습니다. 답변을 삭제하거나 수정하여 올바르지 않다고 표시 할 수 있으며 주석의 유용한 정보로 인해 답변을 보관할 수 있습니다. 정보를 유지하기로 결정했다면 답안에 정보를 추가하는 것을 환영합니다. – patricus