Laravel的递归 - > toArray()

时间:2014-05-16 01:28:32

标签: php laravel laravel-4 eloquent

我正在使用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()
            ]
        ]);
    }

}

2 个答案:

答案 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)

当然healthProfilemedications可以建立关系吗?

如果你这样做,你可以做这样的事情。

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(),这应该有效。任何其他问题,请告诉我。

希望有所帮助。