在laravel中,我很难让一个非常嵌套的关系正常工作。
所需的行为如下,
**我通过ID选择一个事件,我想看看哪些人订阅了它。**现在的问题是事件和人之间有一些表。
这是有效的查询!
SELECT persons.id,
persons.firstname,
persons.lastname,
event_scores.score
FROM events
JOIN cities
ON cities.id = events.city_id
JOIN companies
ON cities.id = companies.city_id
JOIN persons
ON companies.id = persons.company_id
JOIN event_scores
ON event_scores.person_id = persons.id
WHERE event_scores.event_id = 1
GROUP BY persons.id
这些是我的亲戚
事件模型
class Event extends Eloquent
{
protected $table = 'events';
public function city()
{
return $this->belongsTo('City');
}
}
城市模型
class City extends Eloquent
{
protected $table = 'cities';
public function companies()
{
return $this->hasMany('Company');
}
public function event()
{
return $this->hasMany('Event');
}
}
公司模型
class Company extends Eloquent {
protected $table = 'companies';
public function persons()
{
return $this->hasMany('Person');
}
public function city()
{
return $this->belongsTo('City');
}
}
人员模型
class Person extends Eloquent
{
protected $table = 'persons';
public function company()
{
return $this->belongsTo('Company');
}
public function eventscore()
{
return $this->belongsToMany('Event', 'event_scores', 'person_id', 'event_id')
->withPivot('score')
->withTimestamps();
}
}
我所尝试的
return Event::with('city')->with('company')->get();
和
return Event::with('city')
->whereHas('companies', function($query) use ($company_id){
$query->where('company_id', $company_id);
})->get();
还有很多其他的可能性,我真的被这个卡住了。在laravel中实现这种嵌套关系链接有那么难吗?
谢谢!
8条答案
按热度按时间3zwtqj6y1#
如果您只想从
persons
表中选择某些字段,请使用以下命令:bd1hkmkf2#
对于城市和公司的具体领域,你需要分发与雄辩。例如:
请注意,在嵌套的层次中(至少是中层),你必须指定FK到父关系,否则你会得到空集合的嵌套关系!我花了几个小时才弄明白这一点。
62lalag43#
请注意,在嵌套的层次中(至少是中层),你必须指定FK到父关系,否则你会得到空集合的嵌套关系!我花了几个小时才弄明白这一点。
chhkpiq44#
对于事件模型中的两个级别
0sgqnhkj5#
我为这样的情况创建了一个
HasManyThrough
关系:Repository on GitHub安装后,您可以像这样使用它:
您可以使用
withIntermediate()
从中间表中获取属性:bqucvtff6#
为了扩展@ rashmi-nalwaya的答案,我在一个5. 8的项目中做了一些调整。
我的例子有点不同,因为我试图引用hasOne关系,而不是hasMany。
因此,作为参考,域名属于一个网站,属于一个服务器。我只想从所有这些表中返回某些列。我必须这样做。
必须确保我在任何时候都传递了我所在的表的主键(在我的例子中是
id
),其次,我试图访问的相关表的外键。因此,来自域的website_id
和来自网站的server_id
。然后它就完美地工作了。在我的代码中,我在主域上还有一个where子句,在所有这些with-ness之后。
2skhul337#
下面是我的项目代码,我在其中使用了这个。
结果:
ctehm74n8#
这是一个问题,许多开发人员将遇到,为这一目的;您可以在whereRelation子句中链接关系来模拟连接,例如
关系可以继续用点表示法嵌套。希望它能节省你的时间。