Laravel Отношения не работают, как ожидалось - Прокат автомобилей Поиск - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь создать веб-сайт, посвященный прокату автомобилей, и застрял в функции поиска.

На входе будет указана дата получения и возврата, а результат должен бытьсписок автомобилей, доступных в этот период.

Это мои таблицы:

  • Автомобили: идентификатор, имя, категория и т. д.
  • Место размещения: идентификатор, имя клиента, client_second_name и т. д.
  • Счет-фактура: id (не имеет значения), place_id, car_id, pick_up_date, drop_off_date.

Это мои отношения:

Для Car модель:

public function invoices()
{
    return $this->belongsTo('App\Invoice');
}

public function placements()
{
    return $this->belongsTo('App\Placement');
}

Для Placement модели:

public function invoice()
{
    return $this->belongsTo('App\Invoice');
}

public function car()
{
    return $this->hasOne('App\Car');
}

Для Invoice модели:

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

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

Я видел вопрос по этой проблеме, но я не знаю, как применить этот ответ:

$date1 = Carbon::parse('20.02.2018')->startOfDay();
$date2 = Carbon::parse('23.02.2018')->endOfDay();
$available = Car::whereDoesntHave('rentals', function($q) use($date1, $date2) {
    $q->whereBetween('starting_date', [$date1, $date2])
      ->orWhereBetween('ending_date', [$date1, $date2])
      ->orWhere(function($q) use($date1, $date2) {
          $q->where('starting_date', '<', $date1)
            ->where('ending_date', '>', $date2);
      });
})
->get();

Если я попытаюсь выполнить это: $available = Car::doesntHave('placements')->get();, только для целей тестирования, я получаю эту ошибку:

Столбец не найден: 1054 Неизвестный столбец 'cars.placements_id' в 'предложении where' (SQL: выберите * из cars, где не существует (выберите * из placements, где cars. placements_id= placements. id))

Можете ли вы мне помочь, пожалуйста?Если не с точным ответом, может быть, с объяснением?

1 Ответ

0 голосов
/ 16 октября 2018

Это сообщение в основном говорит о том, что у вас нет placements_id в вашем автомобильном столе:

Column not found: 1054 Unknown column 'cars.placements_id' in 'where clause' (SQL: select * from `cars` where not exists (select * from `placements` where `cars`.`placements_id` = `placements`.`id`))

Давайте посмотрим на автомобили Модель:

public function placements(){
    return $this->belongsTo('App\Placement');
}

Этоговоря, что автомобили принадлежат местам размещения, что привело бы к cars.placements_id = placements.id отношениям.

Обратный путь будет

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

Это приведет к cars.id = placements.cars_id отношению.

Все зависит от того, как вы хотите структурировать ваши данные.

РЕДАКТИРОВАТЬ

Чтобы соответствовать вашим требованиям, вы можете подойти к структуре следующим образом (очевидно, вы бы добавили свои собственные столбцы иданные, но вот как это будет по существу работать):

Автомобили:

id | name
------------
1  | Fiesta
2  | Focus

Бронирование:

id | cars_id | placements_id | date_from  | date_to
----------------------------------------------------
1  | 1      |  1           | 2018-10-16 | 2018-10-18
2  | 1      |  2           | 2018-10-19 | 2018-10-19
3  | 2      |  3           | 2018-10-19 | 2018-10-19

Места размещения

id | first_name | surname
--------------------------
1  | Jeff       | Hardy
2  | Matt       | Hardy 
3  | James      | Giraffe 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...