Laravel Eloquent:两种模式之间的多重关系,一对一和一对多

时间:2014-09-05 11:04:40

标签: laravel pivot eloquent one-to-many one-to-one

我对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中。用户。

我想要实现的目标

  • 将字符设置为MAIN给用户
  • 将字符设置为TWINK给用户
  • 查询&#34;用户主要角色是什么,他/她的TWINK角色是什么?&#34;

有没有更好,更智能的方法来代替使用数据透视表,我是否完全偏离此问题?

1 个答案:

答案 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);
}