Laravel多个链接列在另一个表中有关系吗?

时间:2018-06-13 13:36:14

标签: php laravel

我试图在Laravel创建一个排行榜,但是我又遇到了一些猜测什么,关系的问题。他们似乎从来没有在Laravel工作过。就像他们恨我一样。

我有比赛模式

<?php

namespace App\Database;

use Illuminate\Database\Eloquent\Model;

class Match extends Model
{
    protected $primaryKey = 'id';

    protected $table = 'matches';
    public $timestamps = false;
    protected $guarded = ['id'];
}

团队的模式,但有match()函数

<?php

namespace App\Database;

use Illuminate\Database\Eloquent\Model;

class Team extends Model
{
    protected $primaryKey = 'id';

    protected $table = 'teams';
    public $timestamps = false;
    protected $guarded = ['id'];

    public function matches() {
        return $this->hasMany('App\Database\Match', 'team_one_id, team_two_id');
    }
}

我认为问题来自team_one_id, team_two_id,因为团队主键可能位于另一个表的其中一个列中。在count()上调用matches()时会抛出错误。

  

SQLSTATE [42S22]:未找到列:1054未知列&#39; matches.team_one_id,team_two_id&#39;在&#39; where子句&#39; (SQL:选择count(*)作为matches的汇总,其中matchesteam_one_id, team_two_id = 1和matchesteam_one_id, team_two_id不为空)

3 个答案:

答案 0 :(得分:0)

你可以尝试这种语法

返回$ this-&gt; hasMany(&#39; modelPath&#39;,&#39; foreign_key&#39;,&#39; local_key&#39;);

答案 1 :(得分:0)

  

通过这种方式,您可以实现它,在团队模型中添加这些关系和方法

 public function homeMatches() {
    return $this->hasMany('App\Database\Match', 'team_one_id');
 }

 public function awayMatches() {
    return $this->hasMany('App\Database\Match', 'team_two_id');
 }

 public function matches() {
    return $this->homeMatches->merge($this->awayMatches);
 }
  

现在获取数据

$team = Team::find(1);
$matches = $team->matches(); //now it will fetch all matches for both columns
  

如果要将匹配作为属性获取,则可以添加一个方法   在您的团队模型中

public function getMatchesAttribute()
{
   return $this->homeMatches->merge($this->awayMatches);
}

现在您可以将匹配项设为$matches = $team->matches;

  

这是差异

$team->matches返回Illuminate\Database\Eloquent\Collection

$team->matches()返回Illuminate\Database\Eloquent\Relations\{Relation Name}

您不能在matches之类的预先加载中使用Team::with('matches'),因为matches不是关系,而是导致您的错误。您可以做的是在急切加载中添加homeMatchesawayMatches,然后致电$team->matches()

$teams = Team::with('homeMatches', 'awayMatches')->get(); 
$teams->each(function ($team) {
    print_r($team);
    print_r($team->matches()); 
});

答案 2 :(得分:0)

匹配表是否有匹配的列&#39; team_id&#39;? 因为它是用于映射表的laravel文档中的默认命名约定。

如果您确实拥有该列并填充数据,则可以删除外部&amp;来自matches()关系的本地键。你不需要它。 Laravel会自动为您映射。

如果你没有&#39; team_id&#39;在匹配表上,请添加列并为匹配添加相应的团队ID。

<?php

namespace App\Database;

use Illuminate\Database\Eloquent\Model;

class Team extends Model
{
    protected $primaryKey = 'id';

    protected $table = 'teams';
    public $timestamps = false;
    protected $guarded = ['id'];

    public function matches() {
        return $this->hasMany('App\Database\Match');
    }
}