Laravel — Полиморфная связь не работает

#php #laravel #eloquent

#php #laravel #красноречивый

Вопрос:

Итак, у меня есть следующий код:

 class PageSection extends Model {
    protected $table = "PageSection";

    const TYPE_CURATED = 0;
    const TYPE_AUTOMATED = 1;

    public function list() {
        return $this->morphTo('list', 'entity_type', 'id_Entity');
    }
}
  

затем в AppServiceProvider.php У меня есть следующее:

 use AppPageSection;
use AppPageSectionGroup;
use AppPageListEntry;
use AppRSSFeed;
use AppShortcut;
use AppRSSEpisode;
use AppPageList;
use AppAutomatedList;


class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
        Relation::morphMap([
            'Section'                    => PageSection::class,  
            'SectionGroup'               => PageSectionGroup::class,
            PageSection::TYPE_CURATED    => PageList::class,
            PageSection::TYPE_AUTOMATED  => AutomatedList::class,
            PageListEntry::TYPE_FEED     => RSSFeed::class,
            PageListEntry::TYPE_SHORTCUT => Shortcut::class,
            PageListEntry::TYPE_EPISODE  => RSSEpisode::class
        ]);

    }
  

Затем у меня есть тестовый маршрут в моем api routes, который проверяет, загружается ли список, и возвращает null: (Да, я проверил, что сам раздел существует)

 Route::get('/test', function() {
    $section = PageSection::with(['list', 'type'])->find(1);

    // this returns null
    return $section->list;
});
  

Моя схема базы данных для PageSection такова, что entity_type сообщает, что такое модель, а id_Entity является внешним ключом для этой модели, которая называется ‘id’ в таблице, на которую ссылается.

Другие отношения, определенные в morphMap, работают должным образом, но по какой-то причине связь list() в PageSection — нет. Я не уверен, что я здесь делаю не так .. буду признателен за любую помощь.

Ответ №1:

Хорошо, итак, я разобрался, что происходит. Вероятно, это ошибка с morphMap в Laravel. Я использовал 0 для константы PageSection::TYPE_CURATED, которая является ложным значением. Когда я переключился на:

 Relation::morphMap([
    'PageList'                   => PageList::class,
    'AutomatedList'              => AutomatedList::class,
    'Section'                    => PageSection::class,  
    'SectionGroup'               => PageSectionGroup::class,
    PageListEntry::TYPE_FEED     => RSSFeed::class,
    PageListEntry::TYPE_SHORTCUT => Shortcut::class,
    PageListEntry::TYPE_EPISODE  => RSSEpisode::class
]);
  

все работало нормально. Похоже, Laravel не нравится значение 0.