首先请让我概述一下我的数据库结构和关系的骨架:
数据库
stores [ country and city are foreign keys to places.id ]
-------------------
id | country | city
-------------------
1 | 1 | 2
2 | 1 | 3
=============================================
places
--------------------
id | google_place_id
--------------------
1 | pd0nf892nd0s
2 | icnsy63dnaxa
3 | 7m34bcs19cnj
=============================================
place_name_map
------------------------------------------
id | place_id | language | value
------------------------------------------
1 | 1 | en | United Kingdom
2 | 1 | fr | le Royaume-Uni
3 | 2 | en | London
4 | 2 | fr | Londres
5 | 3 | en | Edinburgh
6 | 3 | fr | Édimbourg
Store.php
public function country() {
return $this->hasOne('App\Place','id','country');
}
public function city() {
return $this->hasOne('App\Place','id','city');
}
//my workaround relationships to the possible bug
public function tCountry() {
return $this->hasOne('App\Place','id','country');
}
public function tCity() {
return $this->hasOne('App\Place','id','city');
}
Place.php
public function name() {
return $this->hasOne('App\PlaceNameMap')->where('language',\App::getLocale());
}
所以,现在说我们要查询构建以在用户的区域设置中显示商店的详细信息
$store = Store::where('id',1)
->with(['country.name','city.name'])
->firstOrFail();
dd($store->country->name->value);
这给了我一个 ErrorException:试图获取非对象的属性
而这
$store = Store::where('id',1)
->with(['tCountry.name','tCity.name'])
->firstOrFail();
dd($store->tCountry->name->value);
返回'英国'正确地,假设用户区域设置设置为' en'。
当我死亡并在两种情况下转储$store
时,它们是相同的,除了显然country = tCountry等。
通常我们可以在渴望加载关系时使用列名,那么为什么这似乎是一个例外呢?这是一个错误还是预期的行为?