2014-02-16 2 views
1
과 다형성 관계는

내 상황은 다음과 같습니다 일정은 고객 또는 세일즈맨는 Laravel - 웅변 : 네임 스페이스

나는 또한 이벤트 및 파일 등의 클래스를 가지고 있기 때문에에 속하는, 나는 내 모든 모델 클래스의 네임 스페이스 앱 \ 모델을 사용했다.

이제 내가 할 때

public function calendars() { 
    return $this->morphMany('App\Models\Calendar', 'user'); 
} 

$calendar= Calendar::find(1); //calendar from a salesman 
$calendar->user; //error here 
... 
Customer.php 및 Salesman.php에서
public function user() { 
    return $this->morphTo(); 
} 

Calender.php

에서 :

은 그래서 다형성의 관계를 설정

나는 자신의 오류 메시지 :

Symfony \ Component \ Debug \ Exception \ FatalErrorException 
Class 'salesman' not found 

내가 'salesman' 낮은 어쩌면이 문제는, 맡았다되는 것으로 나타났습니다?

이 내가 Laravels의 스택 트레이스에서 무엇을 얻을

개방 : /var/www/cloudcube/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php

// foreign key name by using the name of the relationship function, which 
// when combined with an "_id" should conventionally match the columns. 
if (is_null($foreignKey)) 
{ 
    $foreignKey = snake_case($relation).'_id'; 
} 

$instance = new $related; //HIGHLIGHTED 

나는 네임 스페이스를 망칠 때이 줄 앞에 비슷한 오류가 있었기 때문에 그 일과 관련이 있다고 생각한다. 올바른 네임 스페이스를 사용하는 방법을 morphTo()에게 알릴 방법이 있습니까?

아니면이 문제의 원인이 뭔가요?

또한이 솔루션을 찾았지만이 작업을 얻이 수없는 것 : 나는 나를 위해 일한 해결책을 발견 Polymorphic Eloquent relationships with namespaces

+0

당신이 데이터베이스에 쿼리 중에 삽입되는 것을 볼 쿼리 전송 상황을 확인하기 위해 쿼리를 로그인 할 수 있습니다. – Shafiul

+0

문제는 'advisor'를 찾을 수 없어 쿼리가 실행되지 않는다는 것입니다. 내가 수동으로 (morphTo()를 덮어 씀으로써) 네임 스페이스를 줄 때, 쿼리는 실행되지만 'App \ Models \ Advisor'를 사용하여 타입 값을 확인합니다 ... SUCKS –

답변

5

.

는 항상 일정에 예를 들어, 올바른 네임 스페이스와의 관계를 정의

public function events() { return $this->hasMany('App\Models\Event'); }

내 문제는이 합병증 중 구성 :

  1. $calendar->user()morphTo(...) 기능이 작동하지 않는로 내 모델이 네임 스페이스에 있었기 때문에 morphTo(...)에이 네임 스페이스를 제공 할 방법이 없었습니다.

  2. $salesman->calenders()->get() 데이터베이스의 내 관계가 있지만 반환 된 빈 목록입니다. 나는 이것이 쿼리와의 바인딩 때문이라는 것을 알았다.

해결 방법 1. 일정 : 사용자 지정 morphTo(...) 함수를 작성하여 Laravel 중 하나를 재정의하십시오. Laravels morphTo(...)의 출처를 기본으로 사용했습니다. 이 함수의 마지막 문장은 return $this->belongsTo($class, $id); 입니다. $class은 이름 공간이있는 클래스 이름이어야합니다. 기본 문자열 연산을 사용하여이를 제거했습니다.

해결 방법 : 2. Salesman에 사용자 정의 morphMany(...) 함수를 작성하고 Polymorphic Eloquent relationships with namespaces과 비슷한 MyMorphMany(...)을 반환하도록합니다.

여기에서 문제는 MyMorphMany 생성자로 전달되는 $query에 잘못된 (네임 스페이스로 된) 바인딩이 있다는 것입니다. where user_type = "App\\Models\\Salesman"을 찾습니다.

이 문제를 해결하려면 함수를 MyMorphMany에 사용하여 기본 Laravels 구현을 덮어 씁니다. 거기서 올바른 네임 스페이스가 아닌 더 낮은 케이스의 클래스 이름을 사용하도록 바인딩을 변경했습니다. 그런 다음이 getResults() 함수를 MyMorphMany 클래스의 get() 함수에서 호출했습니다.

나는 $query->getBindings()$query->setBindings()을 사용하여 바인딩을 수정했습니다. 그것은 나를 :) 저장 한 것처럼이 다른 사람에게 일의 며칠을 절약 할 수

희망

+0

당신은 또한 protected $ morphClass = 'MyMorphMany'; '를 클래스 변수로 사용하기 때문에 커스텀'getResults()'함수를 사용할 필요가 없기 때문에 –

+0

나는 하루 동안 같은 문제를 풀기 위해 노력해 왔고 여전히 그것에 갇혀있다. 수정 된 morphto() 및 morphmany 함수를 공유해 주시겠습니까? – Yashasvi