添加由两个表组合而成的 Laravel WHERE 子句

问题描述 投票:0回答:1

我对 Laravel 很陌生,需要帮助在查询中添加一个 WHERE

我想添加 ->where('trade_point', '>=', 'points_required') trade_point 字段位于表 premiums 中,points_required 字段位于表 user_premiums

这是我的命令,位于 /app/Console/Commands/

我试过这个

$premiums = Premium::select(DB::Raw('*'))
    ->Join('user_premiums', 'user_premiums.premium_id', '=', 'premiums.id')
    ->where('premiums.status',  '=', 'running')
    ->where('premiums.date',  '<=', now())
    ->where('user_premiums.points_required', '>=', 'user_premiums.trade_point')
    ->orderBy('premiums.id', 'DESC')
    ->get(); 

它不会给出任何错误,并记录高级标记为已完成且事务已成功处理,但对数据库不执行任何操作

namespace App\Console\Commands;

use App\Models\Premium;
use App\Models\User;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;

class MarkPremiumsComplete extends Command
{
  
     protected $signature = 'premiums:mark-as-complete';
    

 
    protected $description = 'Mark premiums as complete';

    /**
     * Create a new command instance.

     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
    
     */
    public function handle()
    {
            

          
        $premiums = Premium::with('user_premiums')
        
        ->whereDate('date', '<=', now())
        ->where('status', 'running')
        ->get(); 


        DB::beginTransaction();

        try {
            foreach ($premiums as $premium) {
                foreach ($premium->user_premiums as $prem) {
                    $user = User::find($prem->user_id);
                    $totalPremium = $premium->amount * $prem->trade_point;

                    $user->transactions()->create([
                        'amount' => $totalPremium,
                        'type'   => 'premium',
                        'status' => 'approved',
                    ]);

                    $user->increment('trades_premium', $totalPremium);
                    $user->increment('total_balance', $totalPremium);
                }

                $premium->update(['status' => 'completed']);

                \Log::info('Premiums marked as completed and transactions processed successfully.');
            }

            DB::commit();
        } catch (\Exception $e) {
            DB::rollBack();
            \Log::error('Error '. $e->getMessage());
        
            return 1; // Return error status code
        }

        $this->info('Premiums marked as completed and transactions processed successfully.');
        return 0; // Return success status code
    }
}
php laravel
1个回答
0
投票

我想添加 ->where('trade_point', '>=', 'points_required') trade_point 字段位于表 premiums 中,points_required 字段位于表 user_premiums

根据您上述提到的条件,此查询将不起作用。

$premiums = Premium::select(DB::Raw('*'))
    ->Join('user_premiums', 'user_premiums.premium_id', '=', 'premiums.id')
    ->where('premiums.status',  '=', 'running')
    ->where('premiums.date',  '<=', now())
    ->where('user_premiums.points_required', '>=', 'user_premiums.trade_point')
    ->orderBy('premiums.id', 'DESC')
    ->get();

试试这个..

$premiums = DB::table('premiums')
            ->join('user_premiums','premiums.id','=','user_premiums.premium_id')
            ->where('premiums.status',  '=', 'running')
            ->where('premiums.date',  '<=', Carbon::now())
            ->where('premiums.trade_point','>=','user_premiums.points_required')
            ->select('premiums.*','user_premiums.your-selected-filed','user_premiums.your-selected-field')
            ->orderBy('premiums.id', 'DESC')
            ->get();

N:B:-

1。将

use Carbon\Carbon;
置于脚本顶部。

2。将正确的列放入

'user_premiums.cloumn'
查询的
selecet
部分,从结果集中获取所需数据

尝试一下并告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.