Добавьте дополнительное Eloquent Model Join перед выполнением Query в Laravel - PullRequest
0 голосов
/ 08 февраля 2020

У меня ниже требование присоединения к дополнительной модели city перед выполнением запроса.

Здесь в приведенном ниже коде столбец timezone находится в таблице city.

$this->user->dishwasher->jobs()
->whereBetween("start_date_time", ["convert_tz( now() + interval 1440 minute, '$this->configTimeZone', timezone)", "convert_tz(NOW()+ INTERVAL 10080 MINUTE, '$this->configTimeZone', timezone)"])
->get();

Я попытался добавить with свойство на Dishwasher модальный

class Dishwasher extends Model {
    protected $with = ['city'];
    public function user() {
        return $this->belongsTo('App\User');
    }
    public function jobs() {
        return $this->belongsToMany('App\Job');
    }
    public function city() {
        return $this->belongsTo("App\City");
    }
}

Также я попытался добавить with свойство.

$this->user->dishwasher->jobs()
->whereBetween("start_date_time", ["convert_tz( now() + interval 1440 minute, '$this->configTimeZone', timezone)", "convert_tz(NOW()+ INTERVAL 10080 MINUTE, '$this->configTimeZone', timezone)"])
->with(['city'])
->get();

Но в конце я оказался в одном запросе только,

select 
`jobs`.*, 
`dishwasher_jobs`.`dishwasher_id` as `pivot_dishwasher_id`, 
`dishwasher_jobs`.`job_id` as `pivot_job_id`, 
`dishwasher_jobs`.`id` as `pivot_id`
from `jobs` 
inner join `dishwasher_jobs` on `jobs`.`id` = `dishwasher_jobs`.`job_id` 
where `dishwasher_jobs`.`dishwasher_id` = ? 
and `start_date_time` between ? and ?

Могу ли я узнать, как я могу добавить дополнительные соединения модальных, чтобы я мог использовать в состоянии where?

1 Ответ

0 голосов
/ 08 февраля 2020

Если вы хотите добавить предложение where в модель отношений, используйте метод whereHas(). Также, если вы хотите выбрать jobs() с посудомоечной машиной, добавьте также метод with(). Так что, если я правильно понимаю, у вас должен быть такой код:

$this->user->dishwasher()
->whereHas('city',function($query) use($this->configTimeZone) { // i don't know what $this->configTimeZone is so if it is variable you will need to use it like this in closure
     $query->whereBetween("start_date_time", ["convert_tz( now() + interval 1440 minute, 
            '$this->configTimeZone', timezone)", "convert_tz(NOW()+ INTERVAL 10080 MINUTE, 
            '$this->configTimeZone', timezone)"])
})
->with(['city','jobs'])
->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...