函数 static::created 无法正确保存 Laravel
function static::created does not save properly Laravel
所以我有 2 个表:项目和产品。一个项目 hasMany
个产品和一个产品 belongsTo
个项目。
产品迁移:
Schema::create('products', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('hashed_id')->nullable()->unique();
$table->bigInteger('item_id')->unsigned();
$table->bigInteger('user_id')->unsigned();
$table->integer('state')->default(1);
$table->decimal('price');
$table->string('slug')->nullable()->unique();
$table->timestamps();
$table->foreign('item_id')->references('id')->on('items')->onDelete('cascade');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
对于 hashed_id 我使用以下包:https://packagist.org/packages/hashids/hashids 创建一个散列 ID 以显示在 url.
Product.php
public static function boot()
{
parent::boot();
static::created(function ($product) {
$productId = $product->id;
$hashids = new Hashids("", 10, 'abcdefghijklmnopqrstuvwxyz1234567890');
$hashedId = $hashids->encode($productId++);
$slug = Str::slug($product->item->slug . '-' . $hashedId);
$product->hashed_id = $hashedId;
$product->slug = $slug;
});
}
ProductsController.php
public function createSelfProduct(Request $request)
{
$product = auth()->user()->products()->create([
'item_id' => $request->item_id,
'user_id' => auth()->user()->id,
'price' => $request->price,
]);
// create the product and show seller info
return new ProductResource($product->load('user'));
}
我想做的是,当用户创建新产品时,它应该从项目模型中获取 slug
,将 $hashedId
放在它后面并将其保存到D b。现在,当我通过 Postman 发出 post 请求时,我得到了想要的结果,因为 hashed_id
和 slug
被保存了。但是当我检查数据库时,hashed_id
和 slug
都是 NULL。仅保存 item_id
、user_id
和 price
。我做错了什么,我该如何解决?
Laravel 使用 Observers
可以方便地处理这个问题
https://laravel.com/docs/5.8/eloquent#observers
php artisan make:observer ProductObserver
然后在Observers/ProductObserver.php
public function created(Product $product) {
$product = ''; // whatver you need to do here. $product is an instance of Product model
// Dont forget to save your model after modifying
$product->save();
}
created
事件表示模型已经创建。这不是保存之前,而是保存之后。如果此时更改任何内容,您将需要再次保存记录。
简单地说:您忘记在您的模型实例上调用 save
以在更改后保存更改。
所以我有 2 个表:项目和产品。一个项目 hasMany
个产品和一个产品 belongsTo
个项目。
产品迁移:
Schema::create('products', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('hashed_id')->nullable()->unique();
$table->bigInteger('item_id')->unsigned();
$table->bigInteger('user_id')->unsigned();
$table->integer('state')->default(1);
$table->decimal('price');
$table->string('slug')->nullable()->unique();
$table->timestamps();
$table->foreign('item_id')->references('id')->on('items')->onDelete('cascade');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
对于 hashed_id 我使用以下包:https://packagist.org/packages/hashids/hashids 创建一个散列 ID 以显示在 url.
Product.php
public static function boot()
{
parent::boot();
static::created(function ($product) {
$productId = $product->id;
$hashids = new Hashids("", 10, 'abcdefghijklmnopqrstuvwxyz1234567890');
$hashedId = $hashids->encode($productId++);
$slug = Str::slug($product->item->slug . '-' . $hashedId);
$product->hashed_id = $hashedId;
$product->slug = $slug;
});
}
ProductsController.php
public function createSelfProduct(Request $request)
{
$product = auth()->user()->products()->create([
'item_id' => $request->item_id,
'user_id' => auth()->user()->id,
'price' => $request->price,
]);
// create the product and show seller info
return new ProductResource($product->load('user'));
}
我想做的是,当用户创建新产品时,它应该从项目模型中获取 slug
,将 $hashedId
放在它后面并将其保存到D b。现在,当我通过 Postman 发出 post 请求时,我得到了想要的结果,因为 hashed_id
和 slug
被保存了。但是当我检查数据库时,hashed_id
和 slug
都是 NULL。仅保存 item_id
、user_id
和 price
。我做错了什么,我该如何解决?
Laravel 使用 Observers
可以方便地处理这个问题https://laravel.com/docs/5.8/eloquent#observers
php artisan make:observer ProductObserver
然后在Observers/ProductObserver.php
public function created(Product $product) {
$product = ''; // whatver you need to do here. $product is an instance of Product model
// Dont forget to save your model after modifying
$product->save();
}
created
事件表示模型已经创建。这不是保存之前,而是保存之后。如果此时更改任何内容,您将需要再次保存记录。
简单地说:您忘记在您的模型实例上调用 save
以在更改后保存更改。