如何在Laravel 4中实现两级关系?

时间:2014-03-06 17:37:25

标签: php laravel laravel-4 eloquent

我尝试从实体获取城市名称。我得到了这样的实体:

$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)

感谢您的帮助

2 个答案:

答案 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;
}