Laravel toArray

larval toArray

之前开发的时候遇到的一个问题

数据库查出来的对象在没toArray之前遍历,针对关联的模型里的字段进行重新重组,发现一个问题,取到的关联的模型始终是null,随查看了下源码,才知道关联模型如果是驼峰式的,在toArray的时候才会转为下划线方式,在这之前依然是驼峰式的。

public function relationsToArray()
{
  $attributes = [];
  foreach ($this->getArrayableRelations() as $key => $value) {
    if ($value instanceof Arrayable) {
      $relation = $value->toArray();
    }
    elseif (is_null($value)) {
      $relation = $value;
    }
    if (static::$snakeAttributes) {
      $key = Str::snake($key);
    }
    if (isset($relation) || is_null($value)) {
      $attributes[$key] = $relation;
    }

    unset($relation);
  }
  return $attributes;
}

public static function snake($value, $delimiter = '_')
{
    $key = $value;

    if (isset(static::$snakeCache[$key][$delimiter])) {
        return static::$snakeCache[$key][$delimiter];
    }

    if (! ctype_lower($value)) {
        $value = preg_replace('/\s+/u', '', ucwords($value));

        $value = static::lower(preg_replace('/(.)(?=[A-Z])/u', '$1'.$delimiter, $value));
    }

    return static::$snakeCache[$key][$delimiter] = $value;
}

举个栗子:

$list = (new AgentCostomerRelations())
    ->with([
        'users' => function ($query) {
            return $query->select(['id', 'nickname', 'true_name', 'telephone', 'created_at']);
        },
        'agent' => function ($query) {
            return $query->select('user_id', 'level');
        },
        'userNameRemark',
        'userGroupMap'
    ])->get();
if ($list->isEmpty()) return [];
foreach ($list as &$info) {
  $info['group_id'] = $info->userGroupMap->group_id ?? '';
}
unset($info);
var_dump($list->toArray());exit;

之前在遍历的时候用下划线的方式去访问group_id一直访问不到,这个时候改为驼峰式的才可以访问的得到,还有一个地方就是如果是分页查询,在没有toArray()之前返回的值是没有data这个字段的,是因为这个时候返回的对象是分页的对象,而不是model,最终调用toArray()方法的时候转换,不过这个toArray方法是分页对象自己的toArray方法,\Illuminate\Pagination\LengthAwarePaginator

public function toArray()
{
    return [
        'current_page' => $this->currentPage(),
        'data' => $this->items->toArray(),
        'first_page_url' => $this->url(1),
        'from' => $this->firstItem(),
        'last_page' => $this->lastPage(),
        'last_page_url' => $this->url($this->lastPage()),
        'next_page_url' => $this->nextPageUrl(),
        'path' => $this->path,
        'per_page' => $this->perPage(),
        'prev_page_url' => $this->previousPageUrl(),
        'to' => $this->lastItem(),
        'total' => $this->total(),
    ];
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、编程规约 (一)命名规约 【强制】 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。反...
    喝咖啡的蚂蚁阅读 5,429评论 0 2
  • 阿里巴巴 JAVA 开发手册 1 / 32 Java 开发手册 版本号 制定团队 更新日期 备 注 1.0.0 阿...
    糖宝_阅读 12,301评论 0 5
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,902评论 1 32
  • 模型提供了比数据库类更为强大的数据处理功能,本章讲解了如何使用模型的各种数据自动处理机制来简化开发,包括模型数据的...
    寒冬夜行人_51a4阅读 8,248评论 0 6
  • 最近大街小巷颇为流行一首歌曲叫做《一晃就老了》 其中的歌词“怎么刚刚开始懂事就老了,怎么学会包容就老了”很是扎心。...
    susanpretty阅读 2,801评论 2 3

友情链接更多精彩内容