我有一个带有Id和名字的模型团队。存储所有可能的团队。
我的模型游戏有两列team_1和team_2 ..我需要哪种关系?
我已经测试了很多,但它只适用于一列..
答案 0 :(得分:4)
也许你可以试试这个:
class Team extends Model
{
protected $table = 'teams';
public function gameOwner()
{
return $this->hasMany('App\Games', 'team_1');
}
public function gameVisitor()
{
return $this->hasMany('App\Games', 'team_2');
}
public function games() {
return $this->gameOwner->merge($this->gameVisitor);
}
}
class Game extends Model
{
public function teamOvner() {
return $this->belongsTo('App\Team', 'team_1');
}
public function teamVisitor() {
return $this->belongsTo('App\Team', 'team_2');
}
public function teams() {
return $this->teamOvner->merge($this->teamVisitor);
}
}
答案 1 :(得分:1)
您可能需要考虑重新设计数据库结构,以满足Laravel中关系的意图。
例如,你可以有两个模型
1)团队,列#id;'和' name' (就像你拥有的那样)
2)游戏,列有“id'和' date' (或者游戏的任何其他特定标识符,例如' name'在两个竞争团队之后你将为每个游戏命名 以camelCase为例)。
然后你会推断这种关系如下:
许多球队可以参加特定的比赛(通常是两支球队,但每场比赛可能更多,具体取决于体育赛事的性质),一支球队可以参加多场比赛。这将是Laravel中多对多关系的一个例子。
注意:只有您可以根据您拥有的信息定义关系的确切性质,但这是一种有根据的猜测,这种关系中有许多游戏可能有很多每个游戏的团队,以及特定团队能够参与许多游戏的地方(例如,每次都可能不一定针对不同的竞争者)
然后当你引用模型
在您的团队模型中,您将添加关系
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Team extends Model {
public function games() {
return $this->belongsToMany('App\Game');
}
}
在您的游戏模型中,您将添加关系的反转
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Game extends Model {
public function teams() {
return $this->belongsToMany('App\Team');
}
}
一旦定义了关系,Laravel将创建一个名为game_teams
的连接表您可以使用游戏动态属性访问团队游戏:
$team = App\Team::find(1);
foreach ($team->games as $game) {
//
}
当然,像所有其他关系类型一样,您可以调用游戏方法继续将查询约束链接到关系上:
$games = App\Team::find(1)->games()->orderBy('name')->get();
此外,在创建迁移时,请不要忘记在createGamesTable中包含team_id,以便Laravel可以链接这两个模型。
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateGamesTable extends Migration
{
public function up()
{
Schema::create('games', function(Blueprint $table) {
$table->increments('id');
$table->integer('team_id')->index();
$table->text('name');
$table->timestamps();
});
Eloquent会尝试将Game模型中的team_id与Team模型中的id匹配。 Eloquent通过检查关系方法的名称并使用_id为方法名称添加后缀来确定默认外键名称。
同样,您需要在团队模型中注册game_id。