2017-12-21 5 views
0

Ich versuche, ein Modell zu speichern, das eine Linktabelle ist. Die Tabelle:Laravel speichert Modell mit Fremdschlüsseln

Schema::create('game_has_users', function (Blueprint $table) { 
     $table->integer('game_id')->unsigned(); 
     $table->integer('user_id')->unsigned(); 
     $table->foreign('game_id')->references('id')->on('games')->onUpdate('cascade')->onDelete('cascade'); 
     $table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade')->onDelete('cascade'); 
     $table->timestamps(); 
    }); 

Game_Has_Users Modell:

 class Game_Has_Users extends Model 
{ 
    protected $table = 'game_has_users'; 

    public function user() 
    { 
     return $this->hasOne('App\User', 'user_id'); 
    } 

    public function game() 
    { 
     return $this->hasOne('App\Game', 'game_id'); 
    } 
} 

Ich möchte ein Spiel speichern und danach, sollte das Game_Has_Users Modell eine Benutzer-ID und Spiel-ID erstellt werden.

try { 
     $game = Game::create([]); 
     $user = User::where('name', $request->input('name'))->first(); 

//  $game_users = Game_Has_Users::create([]); 
//  $game_users->user = $user->id; 
//  $game_users->game = $game->id; 
//  $game_users->save(); 

     $test = Game_Has_Users::create([ 
      'user_id' => $user->id, 
      'game_id' => $game->id 
     ]); 
     return response()->json(['t' => $test, 'status' => 'ok']); 
    } 
    catch(\Exception $e) { 
     return response()->json(['status' => 'failed', 'message' => $e]); 
    } 

Allerdings bekomme ich immer die folgende Antwort: Status: fehlgeschlagen, Nachricht: []. Es hat keine Ausnahme, also habe ich keine Ahnung, was ich falsch gemacht habe. Ich versuchte verschiedene Ansätze wie: Standardwerte für Spiel-ID und Benutzer-ID, verschiedene Methoden, um das Link-Modell zu speichern. $ game-> id und $ user-> id haben Werte, wenn ich sie durch eine Antwort sende.

+0

'Game_Has_Users' sollte kein Modell sein. Es ist ein Pivot-Tisch. Sie haben eine viel zu viele Beziehung zwischen Spiel und Benutzern, also definieren Sie das in Ihren Spiel- und Benutzermodellen. – apokryfos

Antwort

1

Sie sollten $fillable Eigenschaft festlegen;

protected $fillable = ['user_id', 'game_id']; 

in Ihrem Game_Has_Users Modell

+0

das hat den Job gemacht, danke! – jordibenck

2

zu Eloquent Conform

Eloquent jeder Tisch einen einzigen Primärschlüssel haben erwartet, so stellen Sie sicher, dass Sie eine ID-Spalte dieser Tabelle hinzuzufügen. Ohne diese Spalte haben Sie Probleme, wenn Sie verschiedene eloquente Methoden nutzen.

Innerhalb der Migration, wird dies eine selbstinkrementierende Primärschlüssel hinzufügen:

$table->increments('id'); 

Nutzen Beziehungen

Als nächstes, wenn ich richtig bin, Games_Has_Users wie ein viele zu viele Beziehung aussieht.

Daher benötigen Sie kein Modell für diese Tabelle. Mit den entsprechenden belongsToMany Beziehungen, können Sie Modelle anhängen zueinander:

$game = Game::find(1); 
$user = User::find(1); 
// Assuming the User model has a games() belongsToMany relationship; 
$user->games()->attach($game); 
// or the inverse 
$games->users()->attach($user); 

Dann können Sie die Sammlung von Spielen für einen Benutzer mit $user->games befestigt zuzugreifen.

Lesen durch https://laravel.com/docs/5.5/eloquent-relationships#many-to-many

Verwandte Themen