如何使用点语法遍历laravel中的模型关系


How do I traverse through model relationships in laravel with dot syntax

我正试图遍历复杂的有说服力的模型关系/属性,我想使用一个简单的点结构来遍历它,类似于使用Arr::get() 遍历数组的方式

示例:

$data = [
  'foo' => [
    'bar' => [
      'key' => 'value'
    ]
  ]
];
$value = Arr::get($data, 'foo.bar.key'); // returns 'value'

我试过使用

$value = Arr::get($model, 'relation.subrelation.attribute')

然而,尽管雄辩的模型支持ArrayAccess,但这会失败,aways返回null。

拉拉威尔有一个简单的方法来实现这一点吗?

对于所有想知道的人,我通过修改arr::pull()函数来专门处理模型,找到了一个解决方案:

public static function traverse($model, $key, $default = null)
{
    if (is_array($model)) {
        return Arr::get($model, $key, $default);
    }

    if (is_null($key)) {
        return $model;
    }
    if (isset($model[$key])) {
        return $model[$key];
    }
    foreach (explode('.', $key) as $segment) {
        try {
            $model = $model->$segment;
        } catch ('Exception $e) {
            return value($default);
        }
    }
    return $model;
}
Eloquent Models返回一个Collection,它与PHP中的Array不同。您可以使用toArray()函数将其转换为数组
$my_model->toArray();

这会给你一个数组。但请记住,它还将主模型中的所有嵌套模型转换为数组。