2016-07-11 14 views
5

Ich muss leider Daten von einem Drittanbieter importieren und ihr nicht standardmäßiges Datenbankschema mit meinem Laravel-Projekt verwenden. Außerdem muss ich mehrere "Firmen" mit jeweils eigenen Benutzern in meiner Datenbank speichern.Laravel-Beziehungen mit zusammengesetzten Nicht-Standard-Fremdschlüsseln

Ich versuche herauszufinden, der beste Weg (wenn es möglich ist), Eloquent zu verwenden, um die Beziehungen zwischen diesen Tabellen zu behandeln. So zum Beispiel mit meiner Tabellenstruktur wie folgt aus:

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

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

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

... zum Beispiel, ich brauche eine „BmPerson“ mit vielen „BmSecurity“ durch die „BmCoverage“ Tabelle zu verknüpfen.

Aber ich muss irgendwie Verbundschlüssel verwenden, weil ich mehrere "Firmen" in jeder Tabelle (nach dem Datenbankschema des Drittanbieters) speichern.

Ein Ansatz, den ich verwendet habe, so weit ist Scoping, zB: für mein BmCoverage Modell:

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);} 

Dann kann ich die Abdeckung Liste für eine einzelne Person abrufen, aber ich muss noch irgendwie in der Lage sein Ordnen Sie "BmCoverage" den "BmSecurities" zu. Ich nehme an, ich könnte auch einen Bereich der BmSecurities-Klasse hinzufügen, aber es wäre schöner, einfach Eloquent zu verwenden.

Hat jemand eine gute Möglichkeit gefunden, zusammengesetzte Schlüssel in Laravel-Modellbeziehungen zu verwenden, oder sollte ich einfach bei der Scoping-Methode bleiben?

+0

Wie sehen Ihre Modellbeziehungen aus? –

+0

Warum haben Sie 2 BmCoverage ?. –

+0

Entschuldigung, ich habe die zweite gelöscht - war ein Duplikat. Momentan kann ich diese Modelle nicht zuordnen, da ich dies über 2 Schlüssel tun müsste (z. B. firstId und personId im Falle der Verbindung von BmPerson mit BmCoverage). Ist das sinnvoll? Ich habe eine eindeutige ID-Spalte, aber ich muss in der Lage sein, basierend auf 2 Schlüsseln statt einer zu beziehen. –

Antwort

2

Alles, was Sie dazu brauchen, ist hier zu finden https://laravel.com/docs/5.2/eloquent-relationships

Sie können ganz einfach festlegen, welche Spalten sohuld die referenzierte Schlüssel sein.

Beispiel:

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

Dies ist wahrscheinlich auf Ihre App \ Firma gehören würde oder was auch immer es genannt wird.

Im Allgemeinen die hasMany Beziehungen sieht wie folgt aus

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

Wie Sie sehen können Sie die Schlüssel angeben können.

+0

Richtig, aber das Problem ist, dass ich in der Lage sein muss, über 2 Schlüssel zu beziehen. Ein "BmPerson" muss also mit vielen "BmCoverages" in Verbindung stehen, aber ich kann keinen eindeutigen Schlüssel verwenden, da der Drittanbieter in diesem Unternehmen eine "firstId" und dann "personId" hat. So kann firstId 1 personIds 1,2,3 haben; und firstId 2 kann auch personIds haben 1,2,3 –

+0

Ich schätze die Zeit, die Sie zu beantworten nahmen, aber ich versuche herauszufinden, eine Situation, in der der Drittanbieter, von dem ich Daten importiere, keinen eindeutigen Schlüssel liefert für die Elemente, die ich referenzieren muss, nicht, wie die Beziehungen auf einer Basisebene zu verwenden sind. Denkst du, ich sollte versuchen, meinen eigenen einzigartigen Schlüssel zu Gegenständen zuzuweisen, während ich versuche, Larvenbeziehungen zu verwenden? –

+1

sollte der Anbieter irgendwie eindeutige Datenkennungen bereitstellen, sollte er nicht? Ich brauche ein wenig mehr Informationen über das, was Sie erhalten, um detailliertere Hinweise zu geben. Ich kann nur vermuten, anders: vielleicht Primärschlüssel aus zwei oder sogar drei Feldern zusammen zu schaffen, um Einzigartigkeit zu gewährleisten –

0

zu schreiben, wie die anderen gesagt haben, müssen Sie die HasMany und HasManyThrough Beziehung verwenden.

Hier aus dem Tabellendefinitionen, müssen Sie einfach Zugriff auf:

  • Person->BmCoverage(s)
  • Person->BmSecurity(s) eines Individuums.

Was ich denke, das Hauptproblem ist hier die Verknüpfung der BmSecurity mit BmCoverage wie anscheinend gibt keine coverage_id pro BmSecurity ist, sondern vielmehr, um ein zusammengesetztes Mapping durch firmId und securityId.

In diesem Fall unterstützt Laravel Composite-Schlüssel leider nicht offiziell, obwohl Sie eine trait like this verwenden könnten ... aber Sie könnten auch das gleiche mit einigen kniffligen hasMany erreichen.

das heißt auf BmCoverage

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

Gleiches gilt für BmSecurity von BmPerson HasManyThrough verwenden.

Hoffe, dass hilft.

+0

Bitte, wie würde die umgekehrte Beziehung aussehen? – Adocad

+0

Hallo @somezombie Ich verstehe deine Frage nicht wirklich. Wenn Sie eine Frage zu Stackoverflow haben, senden Sie mir bitte einen Link, und ich werde einen Blick darauf werfen. Vielen Dank –

Verwandte Themen