我有三个模型:Vehicle
、LiveData
和Place
。
在我的Vehicle
模型中,我目前在Vehicle
和LiveData
之间存在一个关系,它可以获取车辆的最新LiveData
:
public function latestPosition(): HasOne
{
return $this->hasOne(LiveData::class)->latestOfMany();
}
现在在我的LiveData
模型中,我想在LiveData
和Place
之间建立一个关系,但是两者之间没有直接的键,关系是在一个纬度和经度范围之间。这就是在纯SQL中调用关系的方式:
LEFT JOIN `places`
ON `live_data`.`speed` = 0 AND `places`.`lat` BETWEEN (`live_data`.`lat` - 0.00007) AND (`live_data`.`lat` + 0.00007) AND `places`.`lng` BETWEEN (`live_data`.`lng` - 0.00007) AND (`live_data`.`lng` + 0.00007)
因为我想能够用这种关系来和雄辩像这样:
$vehicles = Vehicle::where('disabled', 0)
->with(['latestPosition.place', 'tags'])
->get();
这有可能吗?
1条答案
按热度按时间ilmyapht1#
是也不是
是,可以与非键的字段建立良好的关系。
例如,对于这样的表
您可以使用email而不是key来定义
hasOne
或belongsTo
。外键不是必需的。它们只是使保持数据完整性变得更容易,并且你的rdbms知道如何为它们优化查询。否,您不能定义在后台执行该精确查询的关系。除非你要实现一个自定义的
Relation
类。Laravel没有提供(据我所知)任何解析为LEFT JOIN
子句的关系,该子句将列与值或聚合值进行比较。您可以定义一个查询范围,封装
LiveData
模型上的所有逻辑,然后调用它。我使用
$join->where
而不是$join->on
,因为on
被保留用于比较列,而where
可以用于比较值。