Как заменить запрос на соединение на whereHas? - PullRequest
0 голосов
/ 26 сентября 2018

Я использую Laravel 5.6, и у меня есть стандартный запрос

    Order::where('dict_statuses_id', 1)
->leftJoin('dict_statuses', 'dict_statuses_id', '=', 'dict_statuses.id')
->get();

Так что у меня есть список заказов с подробной информацией, где статус = 1 (новый) после таблицы соединения, я вижу статус как Новый или Полный.Есть ли способ изменить этот запрос, используя whereHas?

я пытался использовать

Order::whereHas('status', function($q){
            $q->where('dict_statuses_id', 1);
        })->get();

Но нет результатов, в модели Порядок у меня

public function status()
    {
        return $this->hasMany('App\DictStatuses');
    }

[Обновлено]

У меня ошибка:

  Column not found: 1054 Unknown column 'dict_statuses.orders_id' 
in 'where clause' (SQL: select * from `orders` where exists 
(select * from `dict_statuses` where `orders`.`id` = `dict_statuses`.`orders_id` and `dict_statuses_id` = 1) 
and `orders`.`deleted_at` is null) 

В моей таблице есть таблица Заказы , где находится поле: dict_statuses_id и таблица dict_statuses с полями: id , public_name

Почему ошибка составляет около dict_statuses.orders_id

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Попробуйте Order :: has ('status') -> get ();

0 голосов
/ 28 сентября 2018

Я думаю, что у вашего dict_statuses нет столбца с именем order_id.

Пожалуйста, включите этот столбец в вашу миграцию

, затем позвоните

Order::whereHas('status', function($q){
        $q->where('dict_statuses_id', 1);
    })->get();

в вашконтроллер

или измените отношение в модели заказа на

public function status(){
 return $this->belongsTo('App\DictStatuses'):
}
0 голосов
/ 26 сентября 2018

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

public function status($id) {
    return $this->hasMany(DictStatuses::class)->where('dict_statuses_id', $id);
}

Попробуйте определить локальный ключ и внешний ключ.

$this->hasMany(DictStatuses::class, 'foreign_key', 'local_key');
...