我正在使用Laravel作为AngularJS前端的API。部分原因是当应用程序加载时,我会在登录用户的情况下预加载应用程序以保存http请求。
是否有递归->toArray()
循环遍历所有属性并将所有雄辩模型转换为jsonable数组?
我在L3中手动创建了一个,但在文档中没有找到类似的内容。
PortalController.php
$user->medications
是一组雄辩的对象。
不起作用
<?php
class PortalController extends BaseController {
public function getIndex()
{
$user = User::find(Auth::user()->id);
$user->healthProfile = $user->getHealthProfile();
$user->medications = $user->getItems('medication');
return View::make('portal.index', [
'init' => [
// The array of medications disappear.
'user' => $user->toArray()
]
]);
}
}
作品
<?php
class PortalController extends BaseController {
public function getIndex()
{
$user = User::find(Auth::user()->id);
$user->healthProfile = $user->getHealthProfile();
$user->medications = $user->getItems('medication')->toArray(); //boop
return View::make('portal.index', [
'init' => [
// The array of medications still exists.
'user' => $user->toArray()
]
]);
}
}
视图/入口/ index.blade.php
<script>
(function() {
'use strict';
angular.module('portal.init', [])
.service('Init', [function() {
return function() {
return {{ json_encode($init) }};
}
}]);
})();
</script>
我的L3类递归转换,希望有一个原生解决方案。
public static function to_array($models)
{
if ($models instanceof Laravel\Database\Eloquent\Model) {
$models = $models->to_array();
}
if (is_array($models)) {
foreach ($models as $key => $value) {
$models[$key] = self::to_array($value);
}
}
return $models;
}
// models / User.php
// ..etc.
public function allergies()
{
return $this->hasMany('PortalItem', 'portal_user_id')
->whereKey('allergy');
}
public function medications()
{
return $this->hasMany('PortalItem', 'portal_user_id')
->whereKey('medication');
}
public function symptoms()
{
return $this->hasMany('PortalItem', 'portal_user_id')
->whereKey('symptom');
}
// ..etc.
// controllers / PortalController.php
<?php
class PortalController extends BaseController {
public function getIndex()
{
$user = User::with('healthProfile', 'medications', 'allergies', 'symptoms', 'procedures', 'immunizations')
->whereId(Auth::user()->id)
->first();
return View::make('portal.index', [
'init' => [
'user' => $user->toArray()
]
]);
}
}
答案 0 :(得分:2)
为什么不使用原生的toJson() method on the eloquent class?
$user->toJson();
所以在你的控制器中它将是
return View::make('portal.index', [
'init' => [
// The array of medications disappear.
'user' => $user->toJson()
]
]);
如果您想要JSON转换中包含的药物 - 您必须先加载它们。
$user = User::with('medications')->all();
答案 1 :(得分:1)
当然healthProfile
和medications
可以建立关系吗?
如果你这样做,你可以做这样的事情。
class PortalController extends BaseController {
public function getIndex()
{
// No need to create a new query for something we already have
$user = Auth::user();
$user->load('healthProfile', 'medications');
return View::make('portal.index', [
'init' => [
'user' => $user->toArray()
]
]);
}
}
然后简单地说,在模板中(我假设您使用的是刀片),您只需:
{{ json_encode($init) }}
这里的假设是你实际上是在使用php / blade变量来预填充javascript中的变量,或者至少让它输出。
laravel提供了toJson()
方法,但这不符合您的需求。尝试设置关系并在刀片/模板文件中使用json_encode()
,这应该有效。任何其他问题,请告诉我。
希望有所帮助。