Построение запросов по нескольким таблицам - PullRequest
0 голосов
/ 13 ноября 2018

Я хочу выполнить следующий запрос с помощью Eloquent.

SELECT * FROM `orders`, `order_status` WHERE `orders`.`id` = `order_status`.`order_id` AND `orders`.`payment` > 0 AND `order_status`.`status_id` = 1

Но я не совсем понимаю, как применить последнее условие (order_status.status_id = 1) к Eloquent, поскольку он находится в другой таблице.Должен ли я присоединиться к ним или я могу применить его через связь Eloquent?

Схема базы данных таблиц:

ЗАКАЗЫ:

Schema::create('orders', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps('');
            $table->integer('sender_id');
            $table->integer('sender_franchise');
            $table->integer('sender_agent')->nullable();
            $table->integer('recipient_franchise');
            $table->integer('recipient_agent')->nullable();
            $table->integer('category_id');
            $table->decimal('payment');
            $table->decimal('final_payment');
            $table->string('order_code');
            $table->decimal('extra_charge');
            $table->integer('recipient_id');
            $table->decimal('condition_charge')->nullable();
            $table->decimal('condition_amount')->nullable();
            $table->boolean('condition_charge_recipient')->nullable();
            $table->integer('quantity');
            $table->integer('created_by');
            $table->string('receiver_name')->nullable();
            $table->string('receiver_ph')->nullable();
            $table->text('shipping_address')->nullable();
});

ORDER_STATUS:

Schema::create('order_status', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('order_id');
            $table->integer('status_id');
            $table->integer('created_by');
            $table->timestamps('');
});

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

попробуйте это см.

DB::table('orders')->join('order_status',function($join){
              $join->on('order_status.order_id','=','orders.id')
                      ->where('order_status.status_id',1)    
})->where('orders.payment','>',0)->get()
0 голосов
/ 13 ноября 2018

Вы можете достичь этого обоими шаблонами.

Для присоединения попробуйте это:

Order::join('order_status', 'orders.id', '=', 'order_status.order_id')
->where('orders.payment', '>', 0)
->where('order_status.status_id', 1);

Для связи попробуйте это:

Order::with('status')->where('orders.payment', '>', 0)->whereHas('status', function ($q) use ($statusId) {
    $q->where('status_id', $statusId);
});

Если $ statusId зафиксирован, вы можете напрямую указать его как 1.

Также определите это отношение в модели заказа.

public function status()
{
    return $this->belongsToMany(Status::class, 'order_status', 'order_id', 'status_id', 'id', 'id');
}
0 голосов
/ 13 ноября 2018

Вы должны попробовать это

Order::join('order_status', 'orders.id' = 'order_status.order_id')
    ->where('orders.payment', '>', 0)
    ->where('order_status.status_id', '=', '1');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...