【发布时间】:2015-10-23 20:48:03
【问题描述】:
我有一个具有 ID 和名称的模型团队。存储所有可能的团队。
我有两列team_1 和team_2 的模型游戏。我需要哪种关系?
我已经测试了很多,但它只适用于一列..
【问题讨论】:
标签: laravel model laravel-5 relationship
我有一个具有 ID 和名称的模型团队。存储所有可能的团队。
我有两列team_1 和team_2 的模型游戏。我需要哪种关系?
我已经测试了很多,但它只适用于一列..
【问题讨论】:
标签: laravel model laravel-5 relationship
也许你可以试试这个:
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);
}
}
【讨论】:
hasMany 更改为hasOne 因为game 可能各有一个。
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'tippsta.team_id' doesn't exist (SQL: select teams.*, team_id.team_1` as pivot_team_1, team_id.team_id as pivot_team_id from @987654332 @inner join team_id on teams.id = team_id.team_id where team_id.team_1 = 1) ` 我想用 $game->team1->name
public function team1() { return $this->belongsTo('App\Team', 'team_1'); } public function team2() { return $this->belongsTo('App\Team', 'team_2'); } 得到它
您可能需要考虑重新设计数据库结构以满足 Laravel 中关系的意图。
例如你可以有两个模型
1) 团队,包含“id”和“name”列(如您所愿)
2) 游戏,包含“id”和“日期”列(或任何其他特定的游戏标识符,如“名称”,您可以在其中以两支竞争球队的名字命名每场比赛 以 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 的连接表
您可以使用 games 动态属性访问团队的游戏:
$team = App\Team::find(1);
foreach ($team->games as $game) {
//
}
当然,与所有其他关系类型一样,您可以调用 games 方法继续将查询约束链接到关系上:
$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 来确定默认的外键名称。
同样,您需要在 Team 模型中注册 game_id。
【讨论】: