Laravel关系无法正常工作-租车搜索

时间:2018-10-16 11:22:15

标签: mysql laravel-5 relationship

我正试图建立一个出租汽车的网站,但我仍然局限于搜索功能。

输入的是上车日期和下车日期,结果应该是该时段内可用的汽车列表。

这是我的桌子:

  • 汽车:id,名称,类别等
  • 展示位置:id,client_name,client_second_name等
  • 发票:id(无关),placement_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');
}

我在此问题上看到了question,但我真的不知道如何应用该答案:

$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“ where子句”中的未知列“ cars.placements_id”(SQL:从cars中选择*,不存在(从placements中选择*,其中carsplacements_id = placementsid))

可以帮我吗?如果没有确切的答复,也许有解释?

1 个答案:

答案 0 :(得分:0)

此信息基本上是说您的车位中没有SerializationFeature.FAIL_ON_EMPTY_BEANS

new ObjectMapper()
    .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
    .writeValueAsString(new Object());

让我们看看汽车模型:

placements_id

这是说Cars属于Placements,这将导致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

您必须添加预订模型,同时还要更改其他模型中的某些关系,但是通过上面的解释,我确定您可以解决这个问题。