使用 Repository 模式将 Eloquent\Collection (Laravel) 转换为 stdClass 数组
Casting Eloquent\Collection (Laravel) to stdClass array using Repository pattern
我正在尝试按照 this article 在 Laravel 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'];
是的,您需要遍历集合并转换每个对象。使用 array_map.
可以节省几行代码
使用 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 模型方法,并且显然还允许我们添加新方法,例如这个一.
你可以这样做,
例如有用户 class
$user = User::find(1)->toArray();
//this is code for convert to std class
$user = json_encode($user);
$user = json_decode($user);
json_decode 默认 return stdClass 对象。
希望对您有所帮助。
您可以使用getQuery()方法convert/cast将\Illuminate\Database\Eloquent\Builder
变为\Illuminate\Database\Query\Builder
。
return $this->model->getQuery()->get();
将 return stdClass
个对象的集合(或 5.3 之前的数组)。
return $this->model->where('email', $email)->getQuery()->first();
将return一个stdClass
对象。
无需获取eloquent个模型并一一转换。
我正在尝试按照 this article 在 Laravel 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'];
是的,您需要遍历集合并转换每个对象。使用 array_map.
可以节省几行代码使用 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 模型方法,并且显然还允许我们添加新方法,例如这个一.
你可以这样做,
例如有用户 class
$user = User::find(1)->toArray();
//this is code for convert to std class
$user = json_encode($user);
$user = json_decode($user);
json_decode 默认 return stdClass 对象。
希望对您有所帮助。
您可以使用getQuery()方法convert/cast将\Illuminate\Database\Eloquent\Builder
变为\Illuminate\Database\Query\Builder
。
return $this->model->getQuery()->get();
将 return stdClass
个对象的集合(或 5.3 之前的数组)。
return $this->model->where('email', $email)->getQuery()->first();
将return一个stdClass
对象。
无需获取eloquent个模型并一一转换。