Eloquent 检索 "belongsTo" 关系时遇到问题

Eloquent relationship trouble retrieving "belongsTo" relationship

我不完全确定问题出在哪里,因为我不理解我收到的错误消息。

我的车辆模型有以下关系

/**
 * The dealer the vehicle belongs to (one-to-one relationship)
 *
 * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
 */
public function dealer()
{
    return $this->belongsTo('App\Dealer');
}

/**
 * The vehicle's specifications
 *
 * @return \Illuminate\Database\Eloquent\Relations\HasMany
 */
public function specifications()
{
    return $this->hasMany('App\Specification');
}

如果我在 $request 中有 "province" 时调用下面的方法,我会收到以下错误:Missing argument 2 for App\Project\Frontend\Repo\Vehicle\EloquentVehicle::App\Project\Frontend\Repo\Vehicle{closure}()

当请求中有 "city" 时,我也会收到错误消息。

public function vehicleSearchResults($request)
{
    $allowedInput = array(
        'year',
        'make',
        'model',
        'city',
        'province',
        'price',
        'Vehicle Type'
    );

    $query = $this->vehicle;

    foreach($allowedInput as $value)
    {
        if($request->has($value))
        {
            switch ($value)
            {
                case 'year':
                    $query = $query->where('model_year', $request->input($value));
                    break;
                case 'make':
                    $query = $query->where('make', $request->input($value));
                    break;
                case 'model':
                    $query = $query->where('model', $request->input($value));
                    break;
                case 'price':
                    $query = $query->where('price', $request->input($value));
                    break;
                case 'city':
                    $query = $query->whereHas('dealer', function($subQuery, $request, $value)
                    {
                        $subQuery->where('city', $request->input($value))
                            ->where('province', $request->input('province'));
                    })->with('dealer');
                    break;
                case 'province':
                    $query = $query->whereHas('dealer', function($subQuery, $request, $value)
                    {
                        $subQuery->where('province', $request->input($value));
                    })->with('dealer');
                    break;
                case 'Vehicle Type':
                    $query = $query->whereHas('specifications', function($subQuery, $request, $value)
                    {
                        $subQuery->where('spec', $value)
                            ->where('spec_value', $request->input($value));
                    })->with('specifications');
                    break;
            }
        }
    }

    return $query->paginate(10);
}

我不知道错误是什么意思,但它指向省份切换案例中的这一行代码。

$query = $query->whereHas('dealer', function($subQuery, $request, $value)

尝试在 ->whereHas

之前使用 ->with('dealer')
$query = $query->with('dealer')
    ->whereHas('dealer', function($subQuery, $request, $value) {
        $subQuery->where('city', $request->input($value))
             ->where('province', $request->input('province'));
    });

你的

$query = $query->whereHas('dealer', function($subQuery, $request, $value) {
    $subQuery->where('province', $request->input($value));
})->with('dealer');
break;

应该是这样的

$search = $request->input($search);
$query = $query->whereHas('dealer', function($subQuery) use ($search) {
{
    $subQuery->where('province', $search);
})->with('dealer');

您必须 use ($search) 才能在回调中访问您想要的变量,因为它是另一个函数

$query = $query->with('dealer')->whereHas('dealer', function($subQuery) use ($request, $value)
{
    $subQuery->where('city', $request->input($value))
        ->where('province', $request->input('province'));
});

只在闭包中使用 $subQuery 并使用 use 注入额外的变量

$request$value 变量具有您需要在子查询中使用的信息,而您尝试这样做的方式是错误的。您正在创建新变量而不是使用现有变量。它应该看起来像下面这样:

->whereHas('dealer', function($subQuery) use($request)
    {
      $subQuery->where('province', $request->input($value));
    })->with('dealer');