用 $this->newQuery () 就可以创建一个查询构造器?

抱歉, 我是一个很新很新的新手, 可能问题过于肤浅, 但我确实我查了很多文章, 琢磨了一下午, 还是想不通, 所以在此提问, 望回复, 谢谢.
关于数据库的查询构造器, 了解到在laravel 中有三种操作数据库的方式, DB 门面法, 查询构造及, 还有就是 Eloquent ORM. 在下面这段删除库存的代码中, newQuery() 是model 的继承的 Database/Eloquent/Model中的方法, 所以实在不明白为什么使用 $this->newQuery() 就可以获取到数据库的查询构造器, 窃以为这还是在使用 ORM 查询器.
file

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
leo
最佳答案

如果你有兴趣,自己追一下 newQuery() 的代码

5年前 评论
讨论数量: 5
leo

如果你有兴趣,自己追一下 newQuery() 的代码

5年前 评论

Leo 你好, 谢谢回复.
首先, 我试着追了一下 newQuery()的代码, 我发现它返回的是 Eloquent/Query.(PS: 水平太菜, 追源代码水平有限)
file
然后, 根据教程的说明,如果 newQuery()是构建了一个查询构造器, 也就是 query builder, 它可以返回影响的行数, 我尝试在 decreaseStock()函数里dd() 减库存后的结果,
dd(ProductSku::where('id', $this->id)->where('stock', '>', $amount)->decrement('stock', $amount));
发现是1, 然后我把$this->newQuery() 改成 ProductSku::, 得到的结果也是1, 这里我也不明白是为什么, 盼解答, 万分感谢.

5年前 评论

@ross 你追踪的没问题,可是你理解错了。你要知道 $this->newQuery() 是在 Illuminate\Database\Eloquent\Model 类中,其中的 $this 代表的是你当前使用的 ModelnewQuery() 方法写明了返回的是 @return \Illuminate\Database\Eloquent\Builder。而函数内部的返回 return $this->registerGlobalScopes($this->newQueryWithoutScopes()); 其实是在找有没有注册全局作用域。追踪代码最终是要找到返回的那个值怎么来的。你的第二个图 public function registerGlobalScopes($builder) 返回的是 $builder,也就是传递的参数。你应该找 newQuery() 里面的参数 $this->newQueryWithoutScopes() 才对

 /**
     * Get a new query builder for the model's table.
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function newQuery()
    {
        return $this->registerGlobalScopes($this->newQueryWithoutScopes());
    }

   /**
     * Get a new query builder that doesn't have any global scopes.
     *
     * @return \Illuminate\Database\Eloquent\Builder|static
     */
    public function newQueryWithoutScopes()
    {
        return $this->newModelQuery()
                    ->with($this->with)
                    ->withCount($this->withCount);
    }

   /**
     * Get a new query builder that doesn't have any global scopes or eager loading.
     *
     * @return \Illuminate\Database\Eloquent\Builder|static
     */
    public function newModelQuery()
    {
        return $this->newEloquentBuilder(
            $this->newBaseQueryBuilder()
        )->setModel($this);
    }

所以最终还是返回的当前 Model
5年前 评论

@小龙也就是说和用orm效果一样的 @leo 大佬怎么看这段分析呢 谢谢

5年前 评论

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