【问题标题】:How to implement a two-level relationship in Laravel 4?如何在 Laravel 4 中实现两级关系?
【发布时间】:2014-03-07 02:22:24
【问题描述】:

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

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

感谢您的帮助

【问题讨论】:

    标签: php laravel laravel-4 eloquent


    【解决方案1】:

    在您的 City 模型中,我认为 addresses() 函数应该是 return $this->hasMany('Address');

    此外,您在遍历 find 查询结果时存在一些错误。

    记住一个实体有很多地址,所以如果你尝试做$entity->address->city,它不知道你在说哪个地址。您将不得不遍历它们。

    我喜欢做的另一件事是不要将你的所有功能都复数化。只需将那些会返回许多东西的东西设为复数即可。例如,一个地址永远只有一个城市(一个地址怎么可能属于多个城市?)然后将函数名称更改为city() 将最有帮助。一个城市可以有多个地址,因此您需要在 City 模型中添加一个 addresses() 函数。

    考虑到这一点,应该为您工作的代码是......

    foreach($entity->addresses as $address) {
        echo $address->city->name;
    }
    

    【讨论】:

    • 感谢您的帮助和建议。事实上,我的城市模型有一个错误。现在,我的实体只有一个地址,所以我确实喜欢 $entity->addresses->first()->city->name,但如果将来我允许有多个地址,我将使用循环。
    【解决方案2】:

    由于每个实体都可以有多个地址并且$entity->addresses() 返回一个Collection-对象,因此您不能直接获取所有城市。您必须遍历所有地址并获取相应的城市。

    $cities = array();
    foreach( $entity->addresses() as $address ) {
      $cities[] = $address->city;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-08-08
      • 2018-08-05
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 2013-08-16
      • 1970-01-01
      相关资源
      最近更新 更多