2016-11-29 3 views
2

ich eine App in Laravel erschaffe 5.Laravel: Erzwingen 12.59 Beziehungen

Die App Ich bin die Schaffung ist eine Rekrutierungsstelle, wo ein Kandidat viele Formulare ausfüllen müssen. Da es viele Felder gibt, habe ich beschlossen, die Tabelle users logisch in viele kleinere Tabellen mit Eins-zu-Eins-Beziehungen zu partitionieren.

Zum Beispiel zwei solche Tabellen wie folgt aussehen:

Benutzer

  • id
  • Rolle (zB Admin oder Kandidaten)
  • first_name
  • Nachnamen
  • dob

driving_licences

  • ID
  • User_id (FK an Benutzer)
  • has_licence
  • NUMBER_OF_POINTS
  • licence_number

In dem obigen einfachen Fall die users hat eine one-to-one Beziehung zu driving_licences. Mit anderen Worten, jedes User Modell muss ein einziges entsprechendes DrivingLicence Modell haben.

Das Erstellen der obigen Tabelle und der entsprechenden Eloquent-Modelle ist einfach genug. Allerdings habe ich Schwierigkeiten, den besten Ansatz zu erzwingen, dass jeder Benutzer (oder jeder Benutzer, der ein Kandidat ist) eine entsprechende DrivingLicence hat.

Die Lösung, die ich zur Zeit habe, ist, wenn ich etwas von DrivingLicence verwende ich zunächst prüfen, ob die Beziehung es existiert und erstellen, wenn es nicht so mag:

if ($user->drivingLicence === null) { 
    $drivingLicence = new DrivingLicence(); 
    $drivingLicence->user_id = $user->id; 
    $drivingLicence->save(); 
} 

Diese jedes Mal getan werden muss, ich muss etwas mit DrivingLicence tun, was natürlich eine Menge Wiederholungen schafft.

Daher meine Frage ist, wie kann ich erzwingen, dass eine 1: 1-Beziehung zwischen users und driving_licences in Laravel besteht.

+0

Dies ist wahrscheinlich nicht der beste Weg, aber könnte Sie auf die richtige Spur bringen: Erstellen Sie eine Funktion in Ihrem 'User' Modell, um zu prüfen, ob die Lizenz null ist. Wenn dies der Fall ist, erstellen und speichern Sie eine neue Lizenz für den Benutzer. '$ user-> checkLicense()'. In 'checkLicense()' überprüfen Sie, ob 'null' ist, erstellen oder holen Sie die Lizenz und geben Sie die Lizenz zurück. Um das klarzustellen, reduziert dies die Notwendigkeit, die Prüfung für die Lizenz ständig neu zu schreiben und verschiebt sie zu einer Funktion innerhalb Ihres Modells. –

+0

Eine Idee, die erforderliche Lizenz zu erzwingen, ist, dass beim Erstellen des Benutzers eine leere Lizenz erstellt wird, die beim Speichern des Benutzers gespeichert wird. Danach können Sie die richtigen Daten eingeben. Sie müssen nicht mehr prüfen, ob die Lizenz existiert, da Sie sie beim Erstellen des Benutzers erstellt haben. –

Antwort

0

Ich denke, ein Benutzer zu zwingen, eine Lizenz zu haben ist das falsche Ziel an erster Stelle. Es ist durchaus möglich, dass ein Benutzer keinen Führerschein hat und anstatt das Feld has_license zu verwenden, um dies anzugeben, erstellen Sie einfach keine Führerschein für sie.

Denken Sie darüber in einem realen Szenario nach. Menschen, die keinen Führerschein haben, haben auch keine Karte, auf der steht, dass sie keine Lizenz haben. Das ist im Grunde, was Sie mit Ihrem aktuellen Datenbankschema modellieren. Stattdessen haben sie einfach nichts, also lassen Sie den driving_licenses Datensatz weg.

Ihr User Modell dann ein Verfahren wie hasDrivingLicense() mit der folgenden Implementierung haben könnte:

public function hasDrivingLicense() 
{ 
    return $this->drivingLicense !== null; 
} 

Ich weiß, dies nicht Ihre direkte Frage nicht beantworten, aber das stand als Bit eines Codes zu mir Geruch.

+1

OK ja für dieses Beispiel. Aber für einige andere Tabellen wie 'next_of_kin' oder' documents' ist das wichtig. –