2016-07-11 6 views
5

Мне, к сожалению, нужно импортировать данные от стороннего поставщика и использовать их нестандартную схему базы данных с моим проектом laravel. Кроме того, мне нужно хранить несколько «фирм», каждый из которых имеет свой собственный набор пользователей в моей базе данных.Laravel отношения с составными, нестандартными внешними ключами

Я пытаюсь найти лучший способ (если это можно сделать) использовать Eloquent для обработки отношений между этими таблицами. Так, например, с моей структурой таблицы, как это:

BmPerson 
    'id', 
    'firmId', 
    'personId' 

BmCoverage 
    'id', 
    'firmId', 
    'personId', 
    'securityId' 

BmSecurity 
    'id', 
    'firmId', 
    'securityId' 

... к примеру, мне нужно, чтобы связать «BmPerson» со многими «BmSecurity» через стол «BmCoverage».

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

Один подход, который я использовал до сих пор является обзорного, например: для моей модели BmCoverage:

public function scopeFromFirm($query,$firmId){ 
    return $query->where('firmId','=',$firmId);//->where('personId','=',$personId);} 

public function scopeFromPerson($query,$personId){ 
    return $query->where('personId','=',$personId);//->where('personId','=',$personId);} 

Тогда я могу получить список покрытия для отдельного человека, но мне еще нужно каким-то образом быть в состоянии связать «BmCoverage» с «BmSecurities». Полагаю, я мог бы просто добавить сферу класса BmSecurities, но было бы лучше использовать Eloquent.

Кто-нибудь придумал хороший способ использовать составные ключи в отношениях модели laravel, или я должен просто придерживаться метода обзора?

+0

Как выглядит ваше отношение к модели? –

+0

Почему у вас есть 2 BmCoverage ?. –

+0

Извините, я удалил второй - был дубликат. Прямо сейчас я не могу связать эти модели, потому что мне нужно будет сделать это через 2 ключа (например, firmId и personId в случае привязки BmPerson к BmCoverage). Имеет ли это смысл? У меня есть уникальный столбец идентификатора, но мне нужно иметь возможность связываться на основе двух ключей вместо одного. –

ответ

2

Все, что нужно для этого можно найти здесь https://laravel.com/docs/5.2/eloquent-relationships

Вы можете легко определить, какие смещ_по_столбцам sohuld быть ссылочный ключ.

Пример:

public function bmCoverages() { 
    return $this->hasMany('App\BmCoverage', 'firmId', 'id'); 
} 

Это, вероятно, принадлежит к вашим App \ фирме или все, что называется.

В целом hasMany отношений выглядит следующим образом

return $this->hasMany('App\Comment', 'foreign_key', 'local_key'); 

Как вы можете видеть, вы можете указать ключи.

+0

Правильно, но проблема в том, что мне нужно иметь возможность связываться по 2 клавишам. Таким образом, «BmPerson» должен быть связан со многими «BmCoverages», но я не могу использовать уникальный ключ, потому что у стороннего поставщика есть «firmId», а затем «personId» внутри этой фирмы. Так что firmId 1 может иметь personId 1,2,3; и firmId 2 может также иметь personIds 1,2,3 –

+0

Я ценю время, которое вы приняли для ответа, но я пытаюсь выяснить ситуацию, когда сторонний поставщик, с которым я импортирую данные, не предоставляет уникальный ключ для элементов, которые мне нужно указать, а не как использовать отношения на базовом уровне. Как вы думаете, я должен попытаться назначить свой собственный уникальный ключ для предметов, поскольку я пытаюсь использовать отношения личинок? –

+1

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

0

Как уже говорили другие, вы должны использовать отношения HasMany и HasManyThrough.

Вот из ваших определений таблицы, вы просто должны иметь доступ к:

  • Person->BmCoverage(s)
  • Person->BmSecurity(s) индивида.

То, что я думаю, что это главная проблема здесь связывающая BmSecurity с BmCoverage, как, по-видимому, нет нет coverage_id за BmSecurity а, составное отображение через firmId и securityId.

В этом случае, к сожалению, Laravel официально не поддерживает составные клавиши, хотя вы можете использовать trait like this ... но вы также можете добиться того же самого с помощью какого-то сложного hasMany.

т.е. на BmCoverage

$this->hasMany('BmSecurity', 'securityId', 'securityId') 
    ->andWhere('firmId', '=', $this->firmId); 

То же самое относится и к BmSecurity от BmPerson использованием HasManyThrough.

Надеюсь, что это поможет.

+0

. Как бы выглядела обратная связь? – Adocad

+0

Здравствуйте @somezombie Я действительно не понимаю ваш вопрос. Если у вас есть вопрос о Stackoverflow, отправьте мне ссылку, и я посмотрю. благодаря –

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