我有3张桌子:
类别(id,名称)
Category_Tournament(category_id,tournament_id) - >数据透视表 Category_Tournament_User(category_id,tournament_id,user_id,已确认)
类别是可用类别的列表 Category_Tournament是管理员配置的类别列表 Category_tournament_User是用户已注册的类别
要获得锦标赛中的所有类别,我可以轻松地完成:
tournament->categories
在锦标赛模型中定义belongsToMany关系
我不知道如何定义与最后一个表的关系。
我需要的是用户点击几个类别,我可以运行类似:
tournament->user_categories->sync($userCategories)
我应该同步表Category_Tournament_User(与category_id,tournament_id,user_id)
实现它的最佳方法是什么?
编辑:
模特锦标赛:
class Tournament extends Model
{
protected $table = 'tournament';
public $timestamps = true;
protected $fillable = [
'name',
'date',
'type',
];
/**
* A tournament is owned by a user
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function owner()
{
return $this->belongsTo('App\User', 'user_id','id');
}
/**
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function categories()
{
return $this->belongsToMany('App\Category')
->withTimestamps();
}
}
模型类别
class Category extends Model
{
protected $table = 'category';
public $timestamps = true;
protected $fillable = [
'id',
'name',
];
public function tournaments()
{
return $this->belongsToMany('App\Tournament');
}
}
模特用户:
class User extends Model implements AuthenticatableContract, CanResetPasswordContract
{
use Authenticatable, Authorizable, CanResetPassword, HasRole;
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'users';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = ['name','firstname','lastname','email', 'password','avatar',country_id','role_id',,'provider','provider_id','verified'];
/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = ['password', 'remember_token'];
/**
* Boot the model.
*
* @return void
*/
public static function boot()
{
parent::boot();
static::creating(function ($user) {
$user->token = str_random(30);
});
}
public function role()
{
return $this->belongsTo('App\Role');
}
public function settings()
{
return $this->hasOne('App\Settings');
}
public function invites()
{
return $this->hasMany('App\Invite', 'email','email');
}
public function country()
{
return $this->belongsTo('Webpatser\Countries\Countries');
}
/**
* A user can have many tournaments
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function tournaments()
{
return $this->hasMany('App\Tournament');
}
}
答案 0 :(得分:0)
User
和Category_Tournament
之间有多对多的关系,您应该仔细查看 Many To Many 的文档。
答案 1 :(得分:0)
我认为你不需要Category_Tournament_User
表。并且你不能在Laravel中为它做Model
。你只需要一张表user_tournament
。你应该在migration
上定义关系(外键),如下所示:
Schema::create('user_tournament', function(Blueprint $table){
$table->engine = 'InnoDB';
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->integer('tournament_id')->unsigned();
$table->unique(['tournament_id', 'user_id']);//You can omit this
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');
$table->foreign('tournament_id')->references('id')->on('tournaments')->onDelete('cascade')->onUpdate('cascade');
$table->nullableTimestamps();
});
然后你可以使用这段代码:
用户> tournaments->同步($ userCategories);