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 关系一到两列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 php Laravel 中的两个表之间创建一对多关系?

Laravel - 加入然后别名两列

想比较laravel中不同表的两列

Laravel查询两列之和之差

Laravel,两列之间的日期范围过滤器

区块链跨链技术大规模应用将在一到两年内爆发