ichihhd
@ichihhd

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Laravel 購入処理をpostmanを介してAPIの実装をしたい

解決したいこと

商品管理ツールを作成しているのですが、postmanを介して商品の購入処理を実装させたいです。
productsテーブルにあるstock(在庫数)をsalesテーブルのidに紐づけて処理を実装させようとしています。【購入処理を施したときにstock(在庫数)を1減算し、0になったらエラーとなり購入ができなくなる処理。】

発生している問題・エラー

①stockが0になったらエラーを吐くコードが思いつかない。
②postmanでURLを"localhost/sub/"で処理を行うと"There are no tests for this request"と出てしまう。

該当するソースコード

api.php

Route::get('/sub', [App\Http\Controllers\SalesController::class, 'sub']);

SalesController.php

<?php

namespace App\Http\Controllers\API;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Sales;


class SalesController extends Controller
{
    //在庫を減算する
 
public function sub(Request $request)
{
    モデルの減算処理を呼び出す
    $sales = new Sales();
    $result = $sales->dec();

    return $result;
}
}

Sales.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\Product;

class Sales extends Model
{
    use HasFactory;

    protected $table = 'sales';
    protected $dates =  ['created_at', 'updated_at'];
    protected $fillable = ['id', 'product_id'];

    public function dec()
    {
    
    // 在庫を減らす処理

    $sales = DB::table('sales')
    ->where('product_id')
    ->join('products', 'sales.product_id', '=', 'products.id')
    ->decrement('stock', 1);

    return $sales;
}
}

postmanのURL

localhost/sub/

Product.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
use App\Models\Company;
use Kyslik\ColumnSortable\Sortable;

class Product extends Model
{
    use HasFactory;

    protected $table = 'products';

    protected $primaryKey = 'id';

    protected $fillable = [
        'product_name',
        'price',
        'stock',
        'comment',
        'img_path',
        'company_id',
        'created_at',
        'updated_at'
    ];
}
0

3Answer

前に別のスレッドで同じ質問を見た覚えがありますけど?

そのスレッドで、自分のレス、他の回答者の方からのレスががあったのにスルーされた記憶もあります。

また同じことになるのですかね?

0Like

Comments

  1. @ichihhd

    Questioner

    ご回答ありがとうございます。
    大変申し訳ございません。以前のものは、ほとんどコードが書かれておらず、質問の内容が伝わりづらいと思ったため、再度投稿させていただきました。

    回答していただいた方々の気も知らず、このような行いをしてお気を悪くさせてしまい申し訳ございません。

他の方には何かしら反応された方がいいかもですが
僕は自分のために回答していて、別にお礼を言っていただきたいわけではないのでお気になさらず

多分 postman で見ているタブが違うだけですね
テストコードが書かれてないのに test results タブを見ているので、そのメッセージが表示されています

testresult.png

結果を見たい場合は body タブを選択してください

0Like

まず、在庫に変更を加える処理ですので、GETリクエストは適切ではありません。冪等性のない変更を加える処理ですのでPOSTリクエストが適切かと思います。

①に関してですが、在庫を減らすというビジネスロジックが正常に行われなかったという状況なので、ステータスコード422あたりを返すのが良いでしょう。エラーを検出したところで、次のようなレスポンスを戻せばよいと思います。

return response()->json(['message' => '在庫がありません'], 422, ['Content-Type' => 'application/json'], JSON_UNESCAPED_UNICODE);
0Like

Your answer might help someone💌