Laravel关系一到两列

时间:2015-08-01 05:30:05

标签: laravel model laravel-5 relationship

我有一个带有Id和名字的模型团队。存储所有可能的团队。

我的模型游戏有两列team_1和team_2 ..我需要哪种关系?

我已经测试了很多,但它只适用于一列..

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。