我对Laravel和Eloquent都很陌生,虽然基础知识也在不断发展,但我正在研究并尝试一段时间才能实现这一目标:
我有一个用户模型和一个角色模型(魔兽世界玩家可能与此问题有关),一个用户有很多角色,一个角色只属于一个用户。
我想存储有关此关系的其他信息(此字符是用户的主要字符或许多TWINK字符之一),因此我尝试使用其他字段( role < / em>),但我无法让它发挥作用。
迁移如下:
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)
因为 - 当然,它是一对一的关系--Eloquent搜索相应的字段,不是在数据透视表中更新,而是在字符表的resp中。用户。
我想要实现的目标
有没有更好,更智能的方法来代替使用数据透视表,我是否完全偏离此问题?
答案 0 :(得分:0)
向字符表
添加列角色 Schema::table('characters', function($table)
{
$table->tinyInteger('role')->unsigned()->nullable()->default(0);
});
当您插入字符时,如果它的主要设置为1,如果它的twink将其保留为0.稍后当您想要从用户检索主要或twinks时,只需使用$ user-&gt; main或$ user- &GT;年轻同性恋者
//model User
public function main()
{
return $this->hasMany('Character')->where('role', '=', 1);
}
public function twinks()
{
return $this->hasMany('Character')->where('role', '=', 0);
}