我尝试从实体获取城市名称。我得到了这样的实体:
$entity = Entity::find(1);
我想得到这样的城市名称:
$entity->addresses->cities->name
但它不起作用?我试过多种方法,但不可能让城市对应于实体。
这是我的模特:
实体:
class Entity extends Eloquent {
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'entities';
public function addresses ()
{
return $this->hasMany('Address');
}
地址:
class Address extends Eloquent {
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'addresses';
public $timestamps = false;
public function cities ()
{
return $this->belongsTo('City');
}
public function entities ()
{
return $this->belongsTo('Entity');
}
城市:
class City extends Eloquent {
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'cities';
public function addresses ()
{
return $this->hasMany('City');
}
我是否必须进行中间操作?或者我必须在我的模型中添加一些内容吗?
我有这个错误:
未定义属性:Illuminate \ Database \ Eloquent \ Collection :: $ cities(查看:/Applications/MAMP/htdocs/project/app/views/administrator/general.blade.php)
感谢您的帮助
答案 0 :(得分:1)
由于每个实体都可以拥有多个地址,而$entity->addresses()
会返回Collection
- 对象,因此您无法直接获取所有城市。你必须遍历所有地址并获得相应的城市。
$cities = array();
foreach( $entity->addresses() as $address ) {
$cities[] = $address->city;
}
答案 1 :(得分:1)
在您的城市模型中,我认为addresses()
函数应该return $this->hasMany('Address');
此外,您在遍历查询结果时遇到了一些错误。
请记住,一个实体有很多地址,所以如果您尝试$entity->address->city
,它就不知道您在说什么地址。你将不得不循环使用它们。
我喜欢做的另一件事是不要复数你的所有功能。只做那些会使许多东西复数的东西。例如,一个地址只有一个城市(一个地址如何属于多个城市?)将函数名称更改为city()
最有帮助。一个城市可以有多个地址,因此您希望addresses()
模型中有City
个功能。
考虑到这一点,应该适合您的代码是......
foreach($entity->addresses as $address) {
echo $address->city->name;
}