Laravel 5 Eloquent在关系中寻找不起作用

时间:2017-03-07 12:29:58

标签: laravel laravel-5 eloquent

我试图创建一个返回与搜索结果相同的记录的搜索字段。我有两个型号,品牌和汽车。我的关系是一个品牌(欧宝,铃木等)有很多车,一辆车属于一个品牌。

品牌模型

class Brand extends Model
{
   protected $fillable = [
    'brandname'
   ];
   public function cars(){
      return $this->hasMany(Car::class);
   }

}

汽车模型

class Car extends Model
{
    public function brand(){
       return $this->belongsTo(Brand::class);
    }
    protected $fillable = [
       'user_id', 'brand_id', 'year', 'licensplate'
    ];
}

我有一个页面,显示所有车辆的一些信息。 Find Cars form

这是该页面的代码:

<div class="col-sm-8 blog-main">
    <h1>Alle auto's</h1><hr>
    <form method="POST" action="/allcars">
        {{csrf_field()}}
        <div class="form-group">
            <input type="text" name="searchfield" placeholder="Merk">
            <button type="submit">Zoek</button>
        </div>
    </form>
    @foreach($brands as $brand)
            @foreach($brand->cars as $car)
                <div class="form-group">
                    <h5>
                        {{$brand->brandname}}
                    </h5>
                    Kenteken: {{$car->licensplate}}<br>
                    Bouwjaar: {{$car->year}}<br>
                </div>
            @endforeach
    @endforeach
</div>

这是我的路线档案:
路线

 Route::post('/allcars', 'CarController@show');

最后我的控制器文件: 的 CarController.php

public function show(){
    $input = request('searchfield');
    if(empty($input))
    {
        return back();
    }

    else if(is_numeric($input))
    {
      // Search on year
      $brands = Brand::with('cars')->whereHas('cars', function($q)
        {
            $input = request('searchfield');
            $q->where('year', $input);
        })->get();
        return view('content.cars.index', compact('brands'));
    }
    else
    {
        // Search on brandname
        $brands = Brand::with('cars')->get()->where('brandname', $input);
        return view('content.cars.index', compact('brands'));
    }
}

else if语句完美运行。当填充整数(年)时,它使用年份搜索,当填写字符串时,它使用品牌搜索。

然而,品牌搜索工作完美。如果我在&#39;欧宝上搜索,我将获得所有汽车的信息,这些信息来自欧宝品牌。但是当我在1990年搜索时,我得到了一个拥有1990年汽车的品牌,然后我也从该品牌获得了其他汽车。

示例:

如果我搜索1990年,我会得到3辆车:欧宝(1990),欧宝(2000)和欧宝(1882)。

另一个例子: 我搜索2000年,我得到5辆车:欧宝(2000),欧宝(1990),欧宝(1882),宝马(2000),宝马(1721)。

我认为我在代码中做错了,请纠正我。 这些是我的迁移btw: 汽车迁移

Schema::create('cars', function (Blueprint $table) {
        $table->increments('id');
        $table->unsignedInteger('user_id');
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        $table->unsignedInteger('brand_id');
        $table->foreign('brand_id')->references('id')->on('brands')->onDelete('cascade');
        $table->string('year');
        $table->string('licensplate');
        $table->timestamps();
    });

品牌迁移

   Schema::create('brands', function (Blueprint $table) {
        $table->increments('id');
        $table->string('brandname');
        $table->timestamps();
    });

1 个答案:

答案 0 :(得分:0)

尝试将else if部分更改为:

else if(is_numeric($input))
    {
      // Search on year
        $brands = Brand::with(['cars' => function ($q) use ($input) {
          $q->where('year',$input);
        }])->get();

        return view('content.cars.index', compact('brands'));
    }