Рюкзак 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;
}