Laravel与数据透视表的关系

时间:2015-12-31 15:49:09

标签: eloquent laravel-5.2

我有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');
}


}

2 个答案:

答案 0 :(得分:0)

UserCategory_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);