2014-02-16 9 views
1

Моей ситуация: а календарь принадлежит Заказчику или коммивояжеруLaravel - Красноречивый: Полиморфные отношения с пространством именами

Потому что у меня есть классы, как Event и File, я использовал пространство имен App \ Модель для всех моих моделей классов.

, так что я создал полиморфной соотношение:

в Calender.php

public function user() { 
    return $this->morphTo(); 
} 

в Customer.php и Salesman.php

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

Теперь, когда я сделать

$calendar= Calendar::find(1); //calendar from a salesman 
$calendar->user; //error here 
... 

Я получаю t его сообщение об ошибке:

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

Я заметил, что 'salesman' низок обсаженная, может быть, это проблема?

и это то, что я получаю от Laravels StackTrace

открыт: /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

Проблема заключается в том, что запрос не отменяется, потому что он не может найти «советника». Когда я вручную (путем перезаписи morphTo()) присваивает пространство имён, запрос excecuted, но использует «App \ Models \ Advisor» для проверки значений типа ... SUCKS –

ответ

5

Я нашел решение, которое работало для меня.

Я всегда определяют отношения с правильным пространством имен, например, в календаре:

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

Моя проблема состояла из 2-х осложнений:

  1. $calendar->user() с функцией morphTo(...) не работает потому что мои модели находились в пространстве имен, а morphTo(...) не имел возможности дать это пространство имен.

  2. $salesman->calenders()->get() возвращенный и пустой список, хотя мои отношения в базе данных были там. Я узнал, что это связано с привязками к запросу.

Раствор для 1.: Написание пользовательских morphTo(...) функции в календаре, чтобы переопределить один из Laravel. Я использовал источник Laravels morphTo(...) в качестве базы. Конечным утверждением этой функции является return $this->belongsTo($class, $id); Там $class должно быть имя класса с именами. Я использовал основные строковые операции, чтобы отключить это.

Решение для 2.: Написание пользовательской функции morphMany(...) в продаже и сдачи в аренду MyMorphMany(...), аналогично тому, что описано Polymorphic Eloquent relationships with namespaces.

Проблема заключается в том, что $query, который передается в конструктор MyMorphMany, имеет неправильное (именное) привязку. Он будет искать where user_type = "App\\Models\\Salesman".

Чтобы исправить это, я использовал пользовательскую функцию getResults() в MyMorphMany, которая переопределяет реализацию Laravels по умолчанию, там я изменил привязки, чтобы использовать правильное имя класса с наименьшим именем. Затем я вызвал эту функцию getResults() в функции get() класса MyMorphMany.

Я использовал $query->getBindings() и $query->setBindings(), чтобы исправить привязки.

Надеется, что это спасает кого-то еще несколько дней работы, как это спасло бы меня :)

+0

вы также можете установить 'protected $ morphClass = 'MyMorphMany'; 'как переменную класса, потому что тогда вам не нужно использовать пользовательскую функцию' getResults() ' –

+0

. Я пытаюсь решить одну и ту же проблему за день и все еще застрял в ней. Можете ли вы поделиться с вами модифицированными функциями morphto() и morphmany? – Yashasvi

Смежные вопросы