【问题标题】:Angular + Laravel 5.1: Saving a $resource with related objectsAngular + Laravel 5.1:保存带有相关对象的 $resource
【发布时间】:2016-02-29 17:49:29
【问题描述】:

我在这种情况下迷路了,希望收到一些关于如何做到这一点的反馈/建议。

我正在构建一个带有 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 更新操作发出 put 请求。

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 对象,但会发送一个仅包含参数的简单对象。我可以跳过不是字符串或整数的输入,但是如果我也更新了该人的详细信息会怎样。如果 Person 也能更新,我会很好,但我不知道最好的方法是什么。

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

  • 在 Angular 端编写自定义保存函数
  • 扩展 Laravel 更新操作以检测对象

【问题讨论】:

    标签: php angularjs laravel-5.1 propel ngresource


    【解决方案1】:

    “您的选项应始终将路由与关注点分开。如果对应用程序无关紧要,请保留一条同时执行两者的路由。”我看不到您的 setPerson 或您如何调用 order.person角度(以及您传递的数据)?您可以将所有内容集中在一条路线上,但请确保使用正确的方法来完成工作。

    “问题来了。Order 对象上的 setPerson 需要一个 Person 对象,但发送了一个仅包含参数的简单对象。我可以跳过不是字符串或整数的输入,但如果我也更新了 person 的详细信息会怎样。如果 Person 也能更新,我会很好,但我不知道最好的方法是什么。”你能再解释一下吗?

    【讨论】:

    • person 对象的使用类似于 {{ order.getPerson().NameFirst }}
    • 当数据发送到 Laravel 服务器时 order.Person 是像 {Id: 6, ContactEmail: "xxx", ContactFacebook: null, ContactPhone: "xxx",...} 这样的对象。使用 propels $order->setPerson() 会引发错误,因为这需要一个 Person 对象。
    • 对。 AngularJS 无法控制您的 PHP 代码。您是否将 order.Person 与 $http/$resource 请求方法一起发送 - 是否发布/补丁/更新?如果您的 PHP 代码需要指定的对象,请传递它。如果你是;然后适当地处理请求。我相信存在同步问题。我无法弄清楚您的 PHP 代码发生了什么。
    • 我没有看到指定您的 setPerson 以及您在哪里执行 setPerson 的代码。如果您正在处理关系数据库,则不需要复制详细信息。只是一个 id 更干净。您的 PHP 代码需要处理该后端业务逻辑。检查您要更新的内容以及为什么?不要忘记数据复制的基础知识。
    • 谢谢。我现在就是这样做的。角度中的订单对象只有人员对象的 id,我为人员创建了单独的对象/控制器。在 angular 对象中有一个 getPerson() 函数,它将使用新控制器从 laravel 加载人员。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 2020-09-03
    • 2015-02-15
    • 2015-11-08
    • 2010-11-30
    • 1970-01-01
    • 2016-07-08
    相关资源
    最近更新 更多