2013-08-19 12 views
1

Im возникли проблемы при создании полиморфного отношения между двумя моделями:Полиморфные отношения в Laravel 4 - morphOne()

  • Загрузить
  • Группа

Упрощенная версия Group Модель:

use Cartalyst\Sentry\Groups\Eloquent\Group as SentryGroupModel; 

class Group extends SentryGroupModel { 

    ... 

    /** 
    * returns the logo (upload model) from this agency 
    * 
    * @return Upload 
    */ 
    public function logo() 
    { 
     return $this->morphOne('Upload', 'uploadable', 'model_type', 'model_id'); 
    } 

    ... 

} 

Упрощенная версия Загрузить модели

class Upload extends Eloquent { 

    ... 

    /** 
    * returns the polymorphic relationship 
    * 
    * @return Upload 
    */ 
    public function uploadable() 
    { 
     return $this->morphTo('uploadable', 'model_type', 'model_id'); 
    } 

    ... 

} 

Как вы можете видеть модель Group на самом деле расширенная модель Sentry 2 Group, которая является стажером расширенная Eloquent модель.

При вызове отношения в контроллере, как например:

$agencyGroup->logo->saveUpload('logo'); 

я получаю ошибку PHP:

Call to a member function saveUpload() on a non-object

Любая помощь с этим?

+0

try $ agencyGroup-> logo() -> saveUpload ('logo'); – Laurence

+0

Вы подтвердили, что '$ agencyGroup' имеет' Upload' в базе данных? Кажется, что вы вызываете '$ agencyGroup-> логотип', который возвращает' NULL', а затем вызывает 'NULL-> saveUpload ('logo')'. – vFragosop

+0

если у меня есть '$ agencyGRoup-> logo()' он возвращает экземпляр 'Illuminate \ Database \ Eloquent \ Relations \ MorphOne', хотя, если я пытаюсь' $ agencyGRoup-> logo() -> saveUpload ('logo') ' я получаю другую ошибку до: 'Call to undefined method Illuminate \ Database \ Query \ Builder :: saveUpload()' – AndrewMcLagan

ответ

2

Функция logo() возвращает MorphOne отношений, и, поскольку не существует метод, который называется saveUpload определен о MorphOne, он перенаправляет вызов к его Builder, который также не имеет методы и бросает второе исключение вы испытываете:

Call to undefined method Illuminate\Database\Query\Builder::saveUpload()

Такое поведение ожидается, и это способ, которым работает Красноречивый человек. Вот почему вы должны использовать только logoбез() как вы пытались в первую очередь.

Хотя ваш $agencyGroup не может иметь логотип, который вызывает NULL->saveUpload() я упомянул и бросает первый исключение:

Call to a member function saveUpload() on a non-object

Попробуйте просто добавить это на контроллере:

if (empty($agencyGroup->logo)) { 
    var_dump("There's no logo."); 
    die(); 
} 

$agencyGroup->logo->saveUpload('logo'); 

Если вы видите сообщение «Нет логотипа», это означает, что вы должны сначала создать один логотип перед вызовом метода saveUpload.

+0

ok, поэтому я думаю, что вы меня на правильном пути ..хотя у меня может отсутствовать основной принцип моделей Eloqquent: , выполнив следующие действия, он должен работать? '$ logo = new Загрузить();' '$ logo = $ agency-> logo() -> save ($ logo);' '$ agency-> logo-> saveUpload ('logo');' это правильно? благодаря! – AndrewMcLagan

+1

Я предполагаю, что это действительно так. Это кажется немного странным фрагментом кода, особенно потому, что я не могу сказать, что ваш метод saveUpload делает за кулисами. Вы должны, конечно, проверить, есть ли у '$ agencyGroup' выгрузка, если вы хотите ее обновить. В противном случае вы можете просто создавать новую 'Upload' каждый раз. – vFragosop