2016-11-30 6 views
2

MassAssignmentException 오류가 발생하는 Laravel의 firstOrNew 메서드를 사용하여 데이터를 저장하려고합니다.Laravel MassAssignmentException from firstOrNew by id

은 데이터베이스에으로 보입니다. 아무 것도 저장하지 않으므로 firstOrNew 메서드가 대량 할당 예외를 트리거해야하는 이유를 이해할 수 없습니다. the docs에서 :

firstOrNew 방법, firstOrCreate 같은 지정된 속성과 일치하는 데이터베이스의 레코드를 찾을 시도합니다. 그러나 모델을 찾을 수없는 경우 새 모델 인스턴스가 반환됩니다. firstOrNew에서 반환 한 모델은 데이터베이스에 아직 보관되지 않았습니다.

왜 그때, 내 코드는 MAE를 던지는해야합니다 데이터베이스와의 행이있는 경우

내가 알고있는 것처럼
$tour = Tour::firstOrNew(array('id' => $this->request['id'])); 

은 모두 위의 코드는 기본적으로 "보면 볼 수있다 말하는 것을 해당 ID가 있으면 행을 반환하고, 그렇지 않으면 관련 속성을 사용하여 새 객체를 만듭니다. " 어떤 데이터도 저장하지 않으므로 문제가 무엇입니까?

오류가 행이 존재하지 않는 경우에만 발생합니다 유의하십시오. ... 그 기록을 찾을 수 없습니다 당신은 무슨 일이 일어나고 있는지 정확히 말한다 텍스트를 복사하고 있습니다 :

+1

사용 $fillable 배열을 설정해야합니다. 귀하의 경우에는 괜찮지 만 대개 ID의 자동 증분이므로 특정 ID를 만들지는 않을 것입니다. firstOr은 다른 속성에 의해 객체를 바꾼다. 이름이 있다면 그것을 가져오고, 그렇지 않으면 그 이름으로 객체를 생성한다. 또한보다 적합한 소리를내는 findOrFail을 생각해 볼 수도 있습니다. https://laravel.com/docs/5.3/eloquent#retrieving-single-models -이 ID를 가진 객체가 있습니까? 그렇게되면 예외가 발생합니다. – Djave

+0

감사합니다. 'findOrFail'은 아마도 문서에 따르면 자동으로 404를 전송하기 때문에 적절하지 않을 수 있습니다. ID는 실제로 자동으로 증가하며 고유 한 것으로 보장 된 유일한 열입니다. 그 이유는 내가 그것을 사용하기를 원했기 때문입니다. 이것 다음에 어떻게 해야할지 모르겠다. – Inigo

+0

그래, 내가 듣고있어. Alexey Mezenin의 대답은 실패한 모든 이유를 다룹니다. 쉬운 편을 원한다면'$ tour = Tour :: find ($ this-> request [ 'id']); if (! $ tour) $ tour = new Tour;'같은 장소에 도착하는 것은 정말 고통스럽지 않을 것입니다. 행운을 빕니다! – Djave

답변

4

firstOrNew() NEW

firstOrNew은 ... 생성자를 사용하여 새 모델을 만들어 newInstance()를 사용합니다. Constructor uses fill() 방법은 Mass Assigment입니다. 그래서 예외가 발생합니다.

그래서, 당신은 당신이 ID를 사용하여 객체를 생성하려는 firstOrNew()

+1

아, 그래. * 생성자는 대량 할당 (Mass Assigment) 인 fill() 메소드를 사용합니다. * 내가 생각하기에 그 열쇠입니다. – Inigo

1

MassAssignmentException는 채울 수 또는 모델에

$guarded = []; 
$fillable = ['explicitlydefinedfield']; 

PS를 정의 보호 필드가없는 경우에 발생 새로운 것을 만들려고 노력합니다.

+0

감사합니다.'guarded'와'fillable' 속성을 설정하는 것에 대해 알고 있습니다. 데이터가 '지속'되지 않을 때 (즉, 저장 됨) 데이터베이스가 필요하지 않은 이유를 이해하지 못합니다. – Inigo

+0

다음 대답이라고 생각합니다. 더 나은 주소 : –