2015-12-31 1 views
0

У меня есть 3 таблицы:Laravel отношения с сводной таблицы

Категория (идентификатор, имя)

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)

Что такое лучший способ добиться этого ???

EDIT:

Модель турнира:

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

У вас есть отношения многие ко многим здесь между User и 10, и вы должны ознакомиться с документацией точно в Many To Many.

+0

Да, но моя проблема заключается в том, что Категория_Турнинг как составной ПК –

+0

немного больше поможет! Я потратил 2 дня на эту проблему, и это будет трудно разрешить с помощью двух строк. –

+0

. Хорошо добавьте модели в ваш OP. –

0

Думаю, что вам не нужно иметь Category_Tournament_User стол. и вы не можете сделать 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(); 
}); 

, то вы можете использовать этот код:

user-> tournaments-> синхронизации ($ userCategories);