我试图在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
的汇总,其中matches
。team_one_id, team_two_id
= 1和matches
。team_one_id, team_two_id
不为空)
答案 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
不是关系,而是导致您的错误。您可以做的是在急切加载中添加homeMatches
和awayMatches
,然后致电$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');
}
}