2015-05-04 10 views
1

У меня есть 2 таблица, связанная с помощью полиморфных отношений:Laravel - Красноречивый - Полиморфные отношения с пространствами имен

The Store стол:

id | name  | ... 
15 | my_store | ... 

И стол Tag, который подключен к столу магазина через related_id и тип.

id | related_id | tag | created | type 
1 | 15   | test | 00:00:00 | store 
2 | 15   | dummy | 00:00:00 | product 

Таким образом, в этом примере, магазин «my_store» имеет только тег «тест» («фиктивный» является тег для продукта, а не магазин, кроме того, он имеет тот же related_id).

У меня есть модель магазина, определенный в моем коде следующим образом:

class Store extends Model { 

protected $table = 'store'; 

public function tags() 
{ 
    return $this->morphMany('App\Tag', 'related', 'type'); 
} 
} 

И модель тег:

class Tag extends Model { 

protected $table = 'tags'; 

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

Но когда я пытаюсь запустить

$store->tags; 

Я видел что запрос, который Laravel пытается запустить, это:

SQL: select * from `mwp_tags` where `mwp_tags`.`related_id` = 46 
and `mwp_tags`.`related_id` is not null 
and `mwp_tags`.`type` = App\Store) 

Запрос ищет App \ Магазин вместо магазин

Я не могу изменить значение в БД, и я не хотел бы использовать

protected $morphClass = 'store'; 

внутри магазина как я не знаю, нужно ли было бы создать другое отношение morphMany, возможно, с другим именем типа.

Кто-нибудь знает, как пропустить эту проблему? Благодаря!

+0

Laravel нуждается в нем как 'App \ Store', поэтому он знает, какой класс загрузить его как. – ceejayoz

ответ

0

Вы могли бы попробовать что-то вроде этого:

public function tags() 
{ 
    $default_morph_class = $this->morphClass ?: null; 
    $this->morphClass = 'store'; 
    $morph_many_query = $this->morphMany('App\Tag', 'related', 'type'); 
    $this->morphClass = $default_morph_class; 
    return $morph_many_query; 
} 

Идея заключалась в том изменении morphClass на лету и установить его обратно. Это позволяет использовать другой morphClass для разных отношений.

+0

Отличный, это работает для меня. Но теперь мне нужно, чтобы обратная связь в модели Tag также работала: 'public function related() { return $ this-> morphTo(); } ' –

+0

' $ this-> morphTo ('related', 'type'); 'ищет модель ** store **, потому что появляется с этим именем в БД, но в Laravel определяется как ** Приложение \ Хранить** –

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