Angular + Laravel 5.1:用相关对象保存 $resource

Angular + Laravel 5.1: Saving a $resource with related objects

我在这种情况下迷路了,想收到一些关于如何做到这一点的 feedback/advice。

我正在构建一个带有 Laravel 5.1 后端和 AngularJS 前端的应用程序。两者对我来说都是新的,但到目前为止我很喜欢它们。对于我的数据库通信,我使用的是 Propel 2。

所以我在 Laravel 设置中使用 Propel 得到了我的 Order 对象,它工作正常。为了在 Angular 中使用这个模型,我创建了一个资源工厂。

angular.module('flex')
    .factory('Order', ['$resource', 'Address', 'Person', function($resource, Address, Person)
    {
        var Order = $resource('/restful/shop/order/:id', {id: '@id'}, {
            query: {
                method: 'GET',
                isArray: true,
                transformResponse: function(data, header)
                {
                    var jsonData = angular.fromJson(data);
                    var orders = [];

                    angular.forEach(jsonData, function(item)
                    {
                        var order = new Order(item);
                        orders.push(order);
                    });

                    return orders;
                }
            },
            update: {
                method: 'PUT',
                params: {id: '@Id'},
            }
        });

        Order.prototype.Person = null;

        Order.prototype.getAddresses = function() {};
        Order.prototype.getOrderProducts = function() {};
        Order.prototype.getPayments = function() {};
        Order.prototype.getPerson = function()
        {
            if (this.Person != null)
                return this.Person;

            var OrderObject = this;
            this.Person = {};

            Person.get({id: this.PersonId}, function (response)
            {
                OrderObject.Person = response;
            });
            return this.Person;
        };
        Order.prototype.getShippingAddress = function() {};

        return Order;
    }])

如您所见,此资源有一个函数 getPerson(),它从另一个资源工厂加载一个人对象。

angular.module('flex')
    .factory('Person', function($resource)
    {
        var Person = $resource('/restful/common/person/:id', {id: '@id'}, {
            query: {
                method: 'GET',
                isArray: true,
                transformResponse: function(data, header)
                {
                    var jsonData = angular.fromJson(data);
                    var persons = [];

                    angular.forEach(jsonData, function(item)
                    {
                        var person = new Person(item);
                        persons.push(person);
                    });

                    console.log(persons);

                    return persons;
                }
            }
        });

        return Person;
    })

到目前为止一切正常。我可以加载和显示我的订单并使用它加载人员对象,还可以显示来自该对象的数据。

当我想存储更新时,问题就来了。如果我调用 Order.$update() ,则会向我的 Laravel 更新操作发出放置请求。

public function update($id, Request $request)
{
    // Check for orderI
    // Load order
    $order = OrderQuery::create()
        ->findPk($id);

    // Iterate data
    foreach ($request->all() as $key => $value)
    {
        echo 'set' . $key . "\n";
        $order->{'set' . $key}($value);
    }

    // Save object
    $order->save();
}

问题来了。 Order 对象上的 setPerson 需要一个 Person 对象,但发送的是一个只有参数的简单对象。我可以跳过不是字符串或整数的输入,但如果我也更新了此人的详细信息怎么办。如果这个人也能更新我会很高兴,但我不知道什么是最好的方法。

我的选择,但我希望有更好的方法:

"Your options should always segregate routes with concerns. If it does not matter to the application keep a single route which does both." 我看不到您的 setPerson 或您在 angular 中调用 order.person 的方式(以及您传递的数据) ?您可以将所有内容都放在一条路线上,但请确保您使用正确的方法来完成这项工作。

"Here comes the problem. setPerson on the Order objects expects an Person object but an simple object with just parameters is sent. I could just skip input that is not string or integer but what if I updated details in the person too. I'd be nice if the Person would be updated too but I don't know what is the best way to do this."你能再解释一下吗?