whereType是laravel的什么用法?

Answer模型的代码

    public function votes($type)
    {
        return $this->morphMany(Vote::class, 'voted')->whereType($type);
    }

其中的whereType这是什么用法,我在文档中没有查到,希望有大佬能指点我一下。
谢谢。

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
洛未必达
最佳答案

先说结论:whereColumn($value) 相当于where('column', '=', $value),例如问题中提到的whereType($type)相当于where('type', '=', $type)。这是Laravel在背后为我们做的事情,今天不妨来debug一番。

首先,我们给app/Models/Traits/VoteTrait.phpvotes()方法简单修改下,并设置上断点:

file

当我们到达第二个断点位置时,我们点击step into按钮:

file

这个时候我们进入了vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Relation.php__call()方法:

file

__call() 方法是 PHP 提供的魔术方法之一:在对象中调用一个不可访问方法时,__call()会被调用。再次step into

file

这下我们会进入vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php

file

这里的$objectvendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php类的一个实例,所以我们会进入它的__call()方法:

file

我们再次step into

file

file

这里的$objectvendor/laravel/framework/src/Illuminate/Database/Query/Builder.php类的一个实例,所以我们会进入它的__call()方法:

file

在这里我们可以看到,是通过dynamicWhere()方法来做的处理。我们进入该方法看下:

file

进入addDynamic()方法:

file

哈,原来是在这里做的处理,其他代码细节的部分就不说了。

3年前 评论
kelike (楼主) 3年前
洛未必达 (作者) 3年前
讨论数量: 1
洛未必达

先说结论:whereColumn($value) 相当于where('column', '=', $value),例如问题中提到的whereType($type)相当于where('type', '=', $type)。这是Laravel在背后为我们做的事情,今天不妨来debug一番。

首先,我们给app/Models/Traits/VoteTrait.phpvotes()方法简单修改下,并设置上断点:

file

当我们到达第二个断点位置时,我们点击step into按钮:

file

这个时候我们进入了vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Relation.php__call()方法:

file

__call() 方法是 PHP 提供的魔术方法之一:在对象中调用一个不可访问方法时,__call()会被调用。再次step into

file

这下我们会进入vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php

file

这里的$objectvendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php类的一个实例,所以我们会进入它的__call()方法:

file

我们再次step into

file

file

这里的$objectvendor/laravel/framework/src/Illuminate/Database/Query/Builder.php类的一个实例,所以我们会进入它的__call()方法:

file

在这里我们可以看到,是通过dynamicWhere()方法来做的处理。我们进入该方法看下:

file

进入addDynamic()方法:

file

哈,原来是在这里做的处理,其他代码细节的部分就不说了。

3年前 评论
kelike (楼主) 3年前
洛未必达 (作者) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!