2016-05-15 7 views
1

Ich habe eine 'Benutzer' Tabelle und 'activation_tokens' Tabelle. Ich habe eine Beziehung im Benutzermodell als hasOne (ActivationToken :: class);Laravel Massenbelegung neuen Datensatz einfügen create() Alternative?

Das funktioniert alles gut. Jetzt möchte ich beim Erstellen eines Benutzers ein Token erstellen. Also rufe ich

$user->ActivationToken()->create(array('token'=>'RANDOM_STRING")); 

Das ist alles gut, aber ich treffe die Masse-Zuweisung Fehler. I nicht möchte 'Token' als befüllbar setzen. Statt

Ich versuche

$activationToken = new ActivationToken(); 
    $activationToken->token = 'RANDOM_STRING"; 
    $activationToken->save(); 

, das in Ordnung ist, aber es ist nicht festgelegt, das user_id Feld in Abfrage. Ich denke, ich könnte es manuell tun, indem ich $activationToken->user_id = $user->id; setze Aber das fühlt sich falsch an, da das ORM dies automatisch behandeln sollte, so weit die Dokumentation zu werben scheint. Also denke ich, dass ich etwas falsch mache?

Ich konnte nicht herausfinden, wie man das richtig macht. Irgendwelche Hinweise?

Danke!

+0

Wenn Sie _ORM way_ gehen wollen, dann müssen Sie Token in Ihre "fillable" -Array für die Massenzuweisung setzen. Andernfalls müssen Sie es manuell mit der nicht bevorzugten Methode '$ activationToken-> user_id = $ user-> id' setzen. Zwei Möglichkeiten, wie du gehen kannst. Warum willst du das Feld nicht auf "befüllbar" setzen? – codedge

+0

Wenn ich alles auffüllen muss, um den ORM-Weg benutzen zu können, stört das nicht den Zweck des Füllbaren/Bewachten?Es sei denn, diese ganze Massenaufgabe ist ein fehlerhaftes Konzept? Wer würde sowieso alle Werte aus einer zufälligen HTTP-Anfrage einer Datenbankabfrage zuordnen. :) Wäre es nicht sauberer, nur eine Funktion in der ActivationToken-Klasse zu erstellen, die ein Argument user_id nimmt und das Token einfügt? Dann könnte ich ActivationToken :: inserToken ($ user-> id) aufrufen und damit fertig sein. –

+0

@codedge bitte die Antwort, die ich gepostet habe. Es scheint einen Weg zu geben, die Tabelle mit Massenzuweisung zu aktualisieren, ohne Spalten zum Füllen hinzuzufügen. –

Antwort

0

Also, nach der Suche im Internet ziemlich viel ich habe herausgefunden, dass ich Massenzuweisungen Einschränkungen vorübergehend stoppen kann.

ActivationToken::unguard(); 
    $user->ActivationToken()->create(array('token'=>str_random(100))); 
    ActivationToken::reguard(); 

Das scheint also gut zu funktionieren. Auch die Antwort von jsphpl war sehr nett und die Lösung unten funktioniert auch gut.

$activationToken = new ActivationToken(); 
    $activationToken->token = str_random(100); 
    $activationToken->user()->associate($user); 
    $activationToken->save(); 

Natürlich bleiben noch einige Fragen offen.

1- Warum ist

$activationToken->user()->associate($user); 

besser als

$activationToken->user_id = $user->id; 

2- Sobald die unguard Linie ausgeführt:

ActivationToken::unguard(); 

Gibt es eine Möglichkeit, dass der Tisch missbraucht werden kann, bevor reguard() wird von einem anderen PHP-Prozess aufgerufen? Hinweis: Ich bin zu raten, den laufenden Prozess bewirkt nur so in meinem Fall soll es vielleicht sicher sein ...

Wie auch immer, diese außerhalb des Geltungsbereichs der ursprünglichen Frage sind so ...

Vielen Dank für all die Antworten!

1

Vielleicht ein bisschen mehr ORM-ish:

... 
$activationToken->user()->associate($user); 
$activationToken->save(); 

$activationToken->user() ist der Name des Bezugs auf das User-Modell zeigt. Beachten Sie die ()!

+0

Ich habe die user() Relation mit goesTo in ActivationToken Modell Allerdings denke ich, attach() funktioniert nicht mit hasOne() und gehört zu() vielleicht? Ich erhalte den Fehler: "Aufruf an undefinierte Methode Illuminate \ Database \ Query \ Builder :: attach()" und meine IDE sagt "Methode 'attach' nicht gefunden in \ Illuminate \ Database \ Eloquent \ Relationen \ BelongsTo" –

+0

Sie haben Recht , sollte dann 'associate ($ user)' statt "attach" sein. Kannst du das versuchen? – jsphpl

+0

Ja, Associate tut es. Aber ich verstehe nicht ganz, was wäre der Vorteil im Vergleich zu $ ​​activationToken-> user_id = $ user-> id; ? Inzwischen habe ich eine bessere Lösung gefunden, denke ich. Ich werde meinen Beitrag aktualisieren. –