私はLaravelとEloquentの両方にまったく慣れておらず、基本が順調に進んでいる間、これを機能させるためにしばらくの間調査と試みを行っています。
ユーザーモデルとキャラクターモデル(World of Warcraftのプレイヤーが問題に関係している可能性があります)があります。ユーザーには多くのキャラクターがあり、キャラクターは1人のユーザーに属しています。
この関係に関する追加情報(このキャラクターがユーザーのメインキャラクターであるか、多くのTWINKキャラクターの1つであるか)を保存したいので、追加のフィールド(ロール)を使用してピボットテーブルを実装しようとしましたが、機能しません。
移行は次のとおりです。
Schema::create('users', function ($table) {
$table->increments('id');
$table->string('username')->unique();
$table->timestamps();
});
Schema::create('characters', function($table)
{
$table->increments('id');
$table->timestamps();
$table->string('name');
});
Schema::create('characters_users', function($table)
{
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->integer('character_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
$table->foreign('character_id')->references('id')->on('characters');
$table->string('type')->default('MAIN'); // can be 'MAIN' or 'TWINK'
});
ではキャラクターモデル、私は次のように定義しています:
public function user()
{
return $this->hasOne('User', 'characters_users.user_id');
}
では、ユーザーモデル、私は次のように定義しています:
public function main()
{
return $this->hasOne('Character', 'characters_users.character_id', 'id')->where('characters_users.role', '=', 'MAIN');
}
public function twinks()
{
return $this->hasMany('Character', 'characters_users.character_id', 'id')->where('characters_users.role', '=', 'TWINK');
}
ここで、関係の例を設定しようとしています。ユーザーとキャラクターの両方を取得し、次のように言いたいと思います。これはこのユーザーのメインキャラクターです。
$user = User::find(1)->first();
$char = Character::whereName('Bruise')->first();
// assign this char as main to the user
$user->main()->save($char);
エラーメッセージは次のとおりです。
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'character_id' in 'field list' (SQL: update `characters` set `updated_at` = 2014-09-05 12:30:58, `character_id` = 1 where `id` = 47)
なぜなら-もちろん、それは1対1の関係です-ピボットテーブルではなく、キャラクターrespのテーブルで更新する対応するフィールドをEloquentが検索します。ユーザー。
達成したいこと
ピボットテーブルを使用する代わりに、これを行うためのより良い、よりスマートな方法はありますか?この問題では完全に軌道から外れていますか?
文字テーブルに列の役割を追加する
Schema::table('characters', function($table)
{
$table->tinyInteger('role')->unsigned()->nullable()->default(0);
});
文字を挿入するとき、メインの場合は1に設定し、イケメンの場合は0のままにします。後でユーザーからメインまたはイケメンを取得する場合は、$ user-> mainまたは$ user-> twinksを使用します。
//model User
public function main()
{
return $this->hasMany('Character')->where('role', '=', 1);
}
public function twinks()
{
return $this->hasMany('Character')->where('role', '=', 0);
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加