Laravel 关系 一到两列
Laravel Relationship One to two columns
我有一个带有 ID 和名称的模型团队。所有可能的团队都已存储。
我的模型游戏有两列 team_1 和 team_2.. 我需要哪个关系?
我测试了很多,但它只适用于一列..
您可能需要考虑重新设计数据库结构以满足 Laravel 中关系的意图。
例如你可以有两个模型
1) 团队,包含 'id' 和 'name' 列(如您所见)
2) 比赛,包含 'id' 和 'date' 列(或比赛的任何其他特定标识符,例如 'name',您可以在其中以两支竞争球队的名字命名每场比赛
例如驼峰命名法)。
那么你会推理出如下关系:
许多球队可以参加一场比赛(通常是两支球队,但根据体育赛事的性质,每场比赛可能更多),一个球队可以参加不止一场比赛。这将是 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
的连接 table
您可以使用游戏动态 属性:
访问团队的游戏
$team = App\Team::find(1);
foreach ($team->games as $game) {
//
}
当然,与所有其他关系类型一样,您可以调用 games 方法继续将查询约束链接到关系上:
$games = App\Team::find(1)->games()->orderBy('name')->get();
此外,在创建迁移时,不要忘记在 createGamesTable 中包含 team_id,以便 Laravel 可以 link 这两个模型。
<?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。
也许你可以试试这个:
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);
}
}
我有一个带有 ID 和名称的模型团队。所有可能的团队都已存储。
我的模型游戏有两列 team_1 和 team_2.. 我需要哪个关系?
我测试了很多,但它只适用于一列..
您可能需要考虑重新设计数据库结构以满足 Laravel 中关系的意图。
例如你可以有两个模型
1) 团队,包含 'id' 和 'name' 列(如您所见)
2) 比赛,包含 'id' 和 'date' 列(或比赛的任何其他特定标识符,例如 'name',您可以在其中以两支竞争球队的名字命名每场比赛 例如驼峰命名法)。
那么你会推理出如下关系:
许多球队可以参加一场比赛(通常是两支球队,但根据体育赛事的性质,每场比赛可能更多),一个球队可以参加不止一场比赛。这将是 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
的连接 table您可以使用游戏动态 属性:
访问团队的游戏$team = App\Team::find(1);
foreach ($team->games as $game) {
//
}
当然,与所有其他关系类型一样,您可以调用 games 方法继续将查询约束链接到关系上:
$games = App\Team::find(1)->games()->orderBy('name')->get();
此外,在创建迁移时,不要忘记在 createGamesTable 中包含 team_id,以便 Laravel 可以 link 这两个模型。
<?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。
也许你可以试试这个:
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);
}
}