2014-12-01 6 views
0

У меня довольно сложная потребность в схемах пользователей, мне бы хотелось узнать лучший способ создания моделей в laravel 4. Я попытался использовать сводную таблицу, но без успеха. Для semplicity я помещаю только несколько полей в таблицу.Laravel 4 Model Eloquent relationship

пользователей

  • ID
  • имя

профили

  • идентификатор
  • поставщик

адреса

  • ID
  • country_id
  • город

страны

  • идентификатор
  • имя

компании

  • ID
  • имя

магазины

  • идентификатор
  • имя

Вот правила:

  1. Пользователь может иметь много адресов (доставки, выставление счетов ...)
  2. Пользователь может иметь много профилей (Используется для социального логин, на facebook, google ...)
  3. Пользователя может иметь много компаний (пользователь может владеть несколькими компаниями)
  4. Пользователя может иметь много магазинов (пользователь может владеть несколькими магазинами)
  5. профиля может иметь один пользователь
  6. Адрес может иметь один пользователь (адрес может быть передан только один пользователь)
  7. адрес может иметь одну компанию (адрес может быть передан только одной компании)
  8. адрес может иметь один магазин
  9. адрес может иметь одно Страна
  10. Страна может иметь много адресов
  11. Компания может иметь много адресов (доставки, выставление счетов ...)
  12. Компания может иметь много магазинов
  13. Компания может иметь множество пользователей
  14. Магазин может иметь множество адресов (доставка, выставление счетов ...)
  15. магазин может иметь множество пользователей
  16. магазин может иметь один Компанию

Я не ищу «» ответ записана, я сделал модели, но, на мой взгляд, логика недостаточно хороша. Например, вот пользователь и Адрес Класс:

class User extends SentryUserModel implements UserInterface, RemindableInterface { 
    use UserTrait, RemindableTrait; 
    public function addresses() { 
    return $this->hasMany('Address'); 
    } 
} 

class Address extends Eloquent { 
    public function user() { 
    return $this->belongsTo('User'); 
    } 
} 

Построение модели таким образом, означает, что Eloquent рассчитывает найти в таблице адресов в поле «user_id». По моему мнению, лучше использовать сводную таблицу, потому что адрес может принадлежать пользователям, компаниям и магазинам, поэтому лучше иметь в таблице адресов поля user_id, company_id и shop_id или использовать три сводные таблицы (user_address, адрес company_address и магазин)?

Сводная таблица будет построена наверняка для пользователя и компании, потому что это очень много отношений.


После @MartinBean ответа я хочу поблагодарить его, но он работает, если в классе пользователя я использую

public function addresses() { 
    return $this->morphMany('Address', 'addressable'); 
} 

и в классе Address я использую

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

В этом путь Я могу легко распечатать, чтобы получить первый текущий адрес пользователя

$user->addresses->first()->address 

и получить электронную почту пользователя от первого адреса текущего пользователя

Address::first()->addressable->email 

Но ты указал мне правильное направление, я думаю, полиморфного отношения, просто для понимания его лучше, почему бы не повернуть? И, как вы думаете, в любом случае для обеспечения взаимоотношений между пользователем и компанией требуется свод?

+1

Что вы пробовали до сих пор? Stack Overflow не является веб-сайтом, чтобы заставить профессиональных разработчиков выполнять работу за вас бесплатно. –

+0

Привет @MartinBean, читая лучше мой вопрос, вы правы, кажется, я прошу о работе, но это не тот случай, я написал обновление, пожалуйста, откатись от голосования. Спасибо – poisons

+0

Я сделал «Адрес» полиморфным, потому что вы хотели иметь возможность использовать адреса в нескольких моделях. Для присоединения к моделям - как пользователь, принадлежащий компании, - тогда я бы использовал сводную таблицу. –

ответ

0

Рассматривая адреса, вы, вероятно, захотите использовать полиморфные отношения, если хотите, чтобы они были доступны и для других моделей.Это будет выглядеть следующим образом:

<?php 

class Address extends Eloquent { 

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

} 

И затем, как это в ваших других моделях:

<?php 

class User extends Eloquent { 

    public function addresses() 
    { 
     return $this->morphMany('Address', 'addresses'); 
    } 

} 

Там больше информации о полиморфных отношениях здесь: http://laravel.com/docs/4.2/eloquent#polymorphic-relations

+0

Спасибо @MartinBean, только одно соображение, я обновляю сообщение – poisons