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');
我不完全确定问题出在哪里,因为我不理解我收到的错误消息。
我的车辆模型有以下关系
/**
* 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');