【发布时间】:2020-03-16 01:56:04
【问题描述】:
在我的 laravel/backpack 4.0 项目中,我有三个模型:
Product: id, name, ...
Pricebook: id, name, ...
Price: id, pricebook_id, value, ...
每次存储新产品 id 数据库时,我都需要在价格表中创建一行。 是否有类似“之前”或“之后”保存挂钩的方法? 如果没有,还有其他解决方案吗?
【问题讨论】:
在我的 laravel/backpack 4.0 项目中,我有三个模型:
Product: id, name, ...
Pricebook: id, name, ...
Price: id, pricebook_id, value, ...
每次存储新产品 id 数据库时,我都需要在价格表中创建一行。 是否有类似“之前”或“之后”保存挂钩的方法? 如果没有,还有其他解决方案吗?
【问题讨论】:
...我对一些琐碎的事情感到困惑,可能是拼写错误。这是解决方案谢谢马丁
<?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;
}
...
【讨论】:
没有这样的钩子,但您可以覆盖这些控制数据库插入/更新的方法。来自文档:
回调 来自 CodeIgniter 或其他 CRUD 系统上的 GroceryCRUD 的开发人员将寻找回调来运行 before_insert、before_update、after_insert、after_update。 Backpack 中没有回调。 store() 和 update() 代码位于 trait 中,因此您可以轻松覆盖该方法,并在新方法中调用它。例如,我们可以在创建操作中保存项目之前/之后执行以下操作:
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;
}
【讨论】: