Php Laravel 6在belongsTo关系上使用with()时,仅*有时*返回null
我正在从事一个项目,在该项目中,我们有一个服务提供商的模型、提供的护理类型和状态: 提供者:Php Laravel 6在belongsTo关系上使用with()时,仅*有时*返回null,php,mysql,laravel,laravel-6,eager-loading,Php,Mysql,Laravel,Laravel 6,Eager Loading,我正在从事一个项目,在该项目中,我们有一个服务提供商的模型、提供的护理类型和状态: 提供者: class Provider extends Model { protected $table = 'providers'; public function status() { return $this->belongsTo('App\Status'); } public function caretype() { return
class Provider extends Model
{
protected $table = 'providers';
public function status() {
return $this->belongsTo('App\Status');
}
public function caretype() {
return $this->belongsTo('App\CareType', 'id');
}
}
护理类型:
class CareType extends Model
{
protected $table = 'type_of_care';
public function providers() {
return $this->hasMany('App\Providers', 'type_of_care_id');
}
public function category() {
return $this->belongsTo('App\CareCategory');
}
}
地位:
class Status extends Model
{
protected $table = 'status';
public function providers() {
return $this->hasMany('App\Providers');
}
}
在mySearchController
(处理提供者搜索请求的控制器)上,使用eager load的show()
函数可以完美地检索caretype
。但是在列出搜索结果集合的search()
函数中,caretype
始终列为空
我不明白为什么它在一个函数中工作而在另一个函数中不工作,特别是当两个函数中的代码完全相同时:
public function search(Request $request)
{
$validated = $request->validate([
//I removed the validation code for this post
]);
$providers = Provider::with(['status', 'caretype'])->get();
return view('search.results', ['providers' => $providers]);
}
public function show($id)
{
$single_provider = Provider::with(['status', 'caretype'])->where('id', $id)->first();
return view('search.details', ['provider' => $single_provider]);
}
在此方面的任何帮助都将不胜感激。我知道模型和关系外键是正确定义的,因为
show()
函数能够很好地获取caretype
。否。您的关系和外键不正确。从
Eloquent通过检查relationship方法的名称并在方法名称后面加上一个\uu
,后跟主键列的名称来确定默认外键名称。但是,如果子模型上的外键不是这样,则可以将自定义键名作为第二个参数传递给belongsTo方法
您正在将id
列作为外键传递给Provider
model的caretype
relation,但您的外键是type of\u care\u id
。因此,当id匹配时会得到一些结果,如果不匹配,则会得到null。将您的关系代码更改为
public function caretype()
{
return $this->belongsTo('App\CareType', 'type_of_care_id');
}
现在又是医生说的
如果父模型未使用id
作为主键,或者希望将子模型联接到其他列,则可以将第三个参数传递给belongsTo
方法,指定父表的自定义键
在您的情况下,
id
是主键。因此,您不必传递第三个参数。只要更新主键引用,一切都会完美工作。哦,天哪,我完全混淆了模型中关系的方向。这把它修好了。非常感谢。