2017-02-10 4 views
1

Я строю приложение блога и у меня естьLaravel отношения с несколькими моделями

Post, City, Neighbourhood, SubNeighbourhood.

Отношения, которые я не имею до сих пор находятся между City, Neighbourhood и subNeighbourhood нравится следующим образом:

subNeighbourhood belongs to Neighbourhood 
Neighbourhood belongs to city 

Второе соотношение, как

City hasMany Neighbourhoods 
Neighbourhood hasMany subNeighbourhoods 

Мои проблемы, когда я создаю пост. Стол сообщений имеет id_city, id_neighbourhood и id_subNeighbourhood.

Вопросы, которые у меня есть следующие:

Если пост структура является правильным? Мне кажется, что многие «id _...» не в порядке.

Вторая проблема - как написать отношение в сообщениях? Все столбцы «id _...» имеют внешние ключи к каждой соответствующей таблице.

+0

Нормальное соглашение в eloquent - это символ '* _id' вместо' id_ * ' –

+0

вы можете дать мне пример ссылки на это? спасибо –

+0

https://laravel.com/docs/5.4/eloquent-relationships. Вы также можете изменить имя столбца для отношений, если хотите, и вы можете это сделать. Какие отношения вы хотите от вас? Пост модели к другим моделям? –

ответ

0

За то, что я могу понять из ваших объяснений пост таблица должна иметь только subneighbourhood_id поле, в классе Post отношение должно быть:

public function subneighbourhood() 
{ 
    return $this->belongsTo('App\Subneighbourhood'); 

Так сообщение принадлежит к Subneighbourhood, который принадлежит окрестности что принадлежит городу

+0

Я понимаю вас, но если я хочу, чтобы получить город за сообщение, я должен написать $ post-> subneighbourhood-> city> city, correct? и о сохранении сообщения, как написать отношение дыр до города? Я новичок в этих сложных вещах, так что это не ясно для меня. спасибо –

+0

Из логики, которую вы написали, отношение ясное и это тот, который вы написали: $ post-> subneighbourhood-> район> город. Если вы написали еще одно поле city_id в столбе столбец, вы могли бы иметь $ post-> city, но два города могли бы быть разными, я не могу представить себе сценарий для этого. – dparoli

+0

Можете ли вы дать мне более подробную информацию об этом сценарии? эта часть, я не понимаю, почему существует такая возможность для разных городов? –

0

Я думаю, что полиморфное отношение будет хорошим решением вашей проблемы. (Я не проверял мой код или что так всегда)

class Post extends Model 
{ 
    // Can return a City or Neighbourhood or SubNeighbourhood 
    public function related() { 
     return $this->morphTo(); 
    } 
} 

class City extends Model 
{ 
    public function posts() { 
     return $this->morphMany(App\Models\Post::class, 'related'); 
    } 
} 


class Neighbourhood extends Model 
{ 
    public function posts() { 
     return $this->morphMany(App\Models\Post::class, 'related'); 
    } 
} 

Как использовать это:

Пример, если у нас есть запись, что связано с городом

$post = Post::find(1); 
$true = ($post->related instanceof City); // This will be true if post related to a city 
$neightbourhoods = $post->related->neightbourhoods(); // All the neightbourhoods of the city 

если мы есть сообщение, имеющее отношение к окрестности

$post = Post::find(2); 
$true = ($post->related instanceof Neighbourhood); // This will be true if post is related to a neighbourhood 
//In this case we can do 
$post->neighbourhood->subNeighbourhoods(); // All the sub neighbourhoods 

Вы можете безопасно пост легко с

+0

Я создал ваше решение в своем коде, но когда я буду во всех подробностях сообщения (название, контент и т. Д.), Я не могу сэкономить. Морф не делает то же самое, что и принадлежность, верно? (я хочу автоматически добавить идентификатор города в city_id) –

+0

морфинг немного умнее и учитывает, какая модель привязана к нему. Он всегда устанавливает идентификатор модели на 'related_id' и определяет, какая таблица запрашивает отношение в поле' related_type'. Поэтому, если 'related_type' является« городом », будет запрошена таблица городов. Если тип «окрестности», запрашивается таблица окрестностей. –

+0

не уверен, почему вы не можете сохранить сообщение. –

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