gpt4 book ai didi

laravel - 使用存储库模式将 Eloquent\Collection (Laravel) 转换为 stdClass 数组

转载 作者:行者123 更新时间:2023-12-02 10:23:25 25 4
gpt4 key购买 nike

我正在尝试按照 this articleLaravel 5 应用程序中实现存储库模式。其中,存储库实现将特定数据源(在本例中为 Eloquent)的对象转换为 stdClass,以便应用程序使用标准格式并且不关心数据源。

为了转换单个 Eloquent 对象,他们这样做:

/**
* Converting the Eloquent object to a standard format
*
* @param mixed $pokemon
* @return stdClass
*/
protected function convertFormat($pokemon)
{
if ($pokemon == null)
{
return null;
}

$object = new stdClass();
$object->id = $pokemon->id;
$object->name = $pokemon->name;

return $object;
}

或者,正如评论中有人指出的那样,这也可行:

protected function convertFormat($pokemon)
{
return $pokemon ? (object) $pokemon->toArray() : null;
}

但是,当我想将整个 Eloquent 对象集合转换为 ** stdClass ** 数组时会发生什么?我是否必须循环遍历集合并分别转换每个元素? 我觉得这会对性能造成很大影响,每次我需要某个集合时都必须循环并转换每个元素,而且感觉很脏。

Laravel 提供了 Eloquent\Collection::toArray() ,它将整个集合转换为数组的数组。我认为这更好,但仍然不是 stdClass

使用通用对象的好处是我可以在我的代码中执行此操作

echo $repo->getUser()->name;

不必这样做:

echo $repo->getUser()['name'];

最佳答案

使用 eloquent 你可以做这样的事情:

/**
* Gets the project type by identifier.
*
* @param string $typeIdentifier
*
* @return object
*
*/
public function getTypeByIdentifier($typeIdentifier)
{
$type = ProjectType::where(
'type_identifier', $typeIdentifier
)->first();

return (object) $type->toArray();
}

我所有的工厂等都接受 stdClass,以便它是统一的。在 eloquent 中,您可以按照上面的方法执行,因为 Eloquent 已经具有序列化所需的 toArray() 函数,但您也可以轻松扩展模型 (Illuminate\Database\Eloquent) 以使此方法可用于所有 eloquent 模型。我建议您扩展该模型,以便您还可以自动化此集合,而不仅仅是单个记录。

因为我将存储库模式与 Eloquent 一起使用,所以我通常会创建一个抽象的 EloquentRepository,它扩展了 Eloquent 模型方法,并且显然还允许我们添加像这样的新方法。

关于laravel - 使用存储库模式将 Eloquent\Collection (Laravel) 转换为 stdClass 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31436448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com