【问题标题】:Laravel 6 eager loading using with() on a belongsTo relationship is only *sometimes* returning nullLaravel 6 在 belongsTo 关系上使用 with() 急切加载只是*有时*返回 null
【发布时间】:2021-01-08 03:06:55
【问题描述】:

我正在开展一个项目,我们有一个服务提供商模型、提供的护理类型和状态:

提供者:

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');
    }
}

在我的SearchController(处理提供者搜索请求的控制器)上,使用预加载的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 就好了。

【问题讨论】:

    标签: php mysql laravel laravel-6 eager-loading


    【解决方案1】:

    不。您的关系和外键不正确。来自doc

    Eloquent 通过检查关系方法的名称并在方法名称后加上 _ 后跟主键列的名称来确定默认的外键名称。但是,如果 Child 模型上的外键不是这样的,您可以将自定义键名称作为第二个参数传递给 belongsTo 方法。

    您在Provider 模型的caretype 关系中将id 列作为外键传递,但您的外键是type_of_care_id。所以当 id 匹配时你会得到一些结果,但如果不匹配,你会得到 null。将您的关系代码更改为

    public function caretype()
    {
        return $this->belongsTo('App\CareType', 'type_of_care_id');
    }
    

    现在再次来自文档

    如果您的父模型不使用id 作为其主键,或者您希望将子模型连接到不同的列,您可以将第三个参数传递给belongsTo 方法,指定您的父表的自定义键。

    在您的情况下,id 是主键。所以你不必传递第三个参数。只需更新主键引用,一切都会正常运行。

    【讨论】:

    • 天哪,我完全混淆了模型中的关系方向。这解决了它。谢谢!
    猜你喜欢
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2020-09-12
    • 2022-01-10
    • 2016-03-31
    • 1970-01-01
    相关资源
    最近更新 更多