Laravel 关系一到两列
Posted
技术标签:
【中文标题】Laravel 关系一到两列【英文标题】:Laravel Relationship One to two columns 【发布时间】:2015-10-23 20:48:03 【问题描述】:我有一个具有 ID 和名称的模型团队。存储所有可能的团队。
我有两列team_1 和team_2 的模型游戏。我需要哪种关系?
我已经测试了很多,但它只适用于一列..
【问题讨论】:
【参考方案1】:也许你可以试试这个:
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);
【讨论】:
@M0riis- 我想你想将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
我已经更新 unswer。尝试。并在控制器中显示您的代码。你想得到什么
@M0rtiis 我的解决方案。现在我用 $game->team1->name public function team1() return $this->belongsTo('App\Team', 'team_1'); public function team2() return $this->belongsTo('App\Team', 'team_2');
得到它
恭喜。查看更新的答案,也许你会喜欢这种方式【参考方案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。
【讨论】:
App\Team::where('active', 1)->get() 对不起,上面的代码是一个错字,不知道你会如何去按照你想要的方式设置它。祝你好运!以上是关于Laravel 关系一到两列的主要内容,如果未能解决你的问题,请参考以下文章