Angular + Laravel 5.1: сохранение $ ресурса со связанными объектами

0

Я потерялся в этой ситуации и хотел бы получить некоторые отзывы/советы о том, как это сделать.

Я создаю приложение с поддержкой Laravel 5.1 и интерфейсом AngularJS. Оба новы для меня, но я их до сих пор люблю. Для моей связи с базой данных я использую Propel 2.

Таким образом, я получил свой объект Order в настройке Laravel с Propel, который отлично работает. Чтобы использовать эту модель в 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(), которая загружает объект person из другой фабрики ресурсов.

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;
    })

Пока все отлично работает. Я могу загрузить и отобразить мои заказы и загрузить объект человека с этим, а также отобразить данные с этого объекта.

Проблема возникает, когда я хочу хранить обновления. Если я вызываю "Заказ". $ 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();
}

Здесь возникает проблема. setPerson на объектах Order ожидает объект Person, но отправляется простой объект с только параметрами. Я мог бы просто пропустить ввод, который не является строкой или целым числом, но что, если я обновляю детали и у человека. Мне было бы хорошо, если бы человек тоже был обновлен, но я не знаю, как лучше всего это сделать.

Мои варианты, но я надеюсь, что есть лучший способ:

  • Напишите пользовательскую функцию сохранения на угловой стороне
  • Расширение действия обновления Laravel для обнаружения объектов
Теги:
laravel-5.1
propel
ngresource

1 ответ

0
Лучший ответ

"Ваши варианты всегда должны выделять маршруты с опасениями. Если это не имеет значения, приложение сохраняет один маршрут, который делает оба". Я не вижу вашего setPerson или как вы вызываете order.person в угловом (вместе с данными, которые вы передаете)? Вы можете сохранить все в одном маршруте, но убедитесь, что используете правильные методы для выполнения этой работы.

"Здесь возникает проблема: setPerson на объектах Order ожидает объект Person, но отправляется простой объект с просто параметрами. Я мог бы просто пропустить ввод, который не является строкой или целым числом, но что, если бы я обновил детали в персоне. быть хорошим, если бы человек тоже был обновлен, но я не знаю, как лучше всего это сделать ". Можете ли вы объяснить это больше?

  • 0
    Объект person используется как {{order.getPerson (). NameFirst}}
  • 0
    Когда данные отправляются на сервер Laravel order.Person является объектом типа {Id: 6, ContactEmail: "xxx", ContactFacebook: null, ContactPhone: "xxx",…}. Использование propels $ order-> setPerson () выдает ошибку, поскольку ожидается объект Person.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню