Рюкзак Laravel 4.0. Сохраните модель, затем другую (другую)

В моем проекте laravel/backpack 4.0 у меня есть три модели:

Product:   id, name, ...
Pricebook: id, name, ...
Price:     id, pricebook_id, value, ...

Мне нужно создавать строку в таблице цен каждый раз, когда новый продукт хранится в базе данных идентификаторов. Есть ли такой метод, как "до" или "после" сохранения для перехвата? если нет, то какое-нибудь другое решение?

2 ответа

... Меня запутала какая-то банальность, возможно неправильное написание. Это решение, спасибо Мартину

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Requests\ProductRequest;
use Backpack\CRUD\app\Http\Controllers\CrudController;
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD;
use App\Models\Price;

class ProductCrudController extends CrudController
{
    use \Backpack\CRUD\app\Http\Controllers\Operations\ListOperation;
    use \Backpack\CRUD\app\Http\Controllers\Operations\CreateOperation {store as traitStore ;}
    use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation;
    use \Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation;
    use \Backpack\CRUD\app\Http\Controllers\Operations\ShowOperation;

    public function store()
    {
        $request = $this->crud->validateRequest();
        $response = $this->traitStore();

        //get last inserted row id
        $entryID = $this->data['entry']->id;

        $price = new Price();
        $price->product_id = $entryID;
        $price->price = 0;
        $price->save();

        // show a success message
        \Alert::success('New price created in DEFAULT_BASE_PRICEBOOK'))->flash();

        return $response;
    }

    ...

Таких ловушек нет, но вы можете переопределить эти методы, управляющие вставкой / обновлением базы данных. Из документации:

Обратные вызовы Разработчики, переходящие из GroceryCRUD в CodeIgniter или другие системы CRUD, будут искать обратные вызовы для запуска before_insert, before_update, after_insert, after_update. В Backpack нет обратных вызовов. Код store() и update() находится внутри трейта, поэтому вы можете легко перезаписать этот метод и вызвать его внутри вашего нового метода. Например, вот как мы можем делать что-то до / после сохранения элемента в операции Create:

namespace App\Http\Controllers\Admin;

use Backpack\CRUD\app\Http\Controllers\CrudController;

class ProductCrudController extends CrudController
{
    use \Backpack\CRUD\app\Http\Controllers\Operations\CreateOperation { store as traitStore; }

    // ...

    public function store()
    {
      // do something before validation, before save, before everything
      $response = $this->traitStore();
      // do something after save
      return $response;
    }

Источник

Другие вопросы по тегам