首页
学习
活动
专区
圈层
工具
发布

与Raw
EN

Stack Overflow用户
提问于 2017-06-16 19:16:11
回答 1查看 1.3K关注 0票数 3

我对laravel很陌生,到目前为止我很喜欢口才和提问者,但是一旦查询变得更加复杂,我的头就开始痛起来……我刚刚完成了两个工作例子后相当一段时间,也许你们可以帮助我优化它。我将首先给出示例,然后给出(Dis)的优点。

首先DB::选择..。老实说,我认为比第二个例子更易读。或者我只是做错了建造者的事情,xD。

代码语言:javascript
复制
    $shared_slugs   = Magic::in_query($this->shared_slugs);

    $items = DB::select("
        SELECT * FROM f_admin_items
        WHERE
            active = 1
        AND (
            slug IN $shared_slugs
            OR
            :treshhold <= :urank AND id IN (SELECT admin_item_id FROM f_user_access WHERE user_id = :uid)
            OR
            :treshhold > :urank AND `rank` >= :urank
        )
        ORDER BY `order` ASC
    ", [
        'treshhold' => $this->threshold_rank,
        'urank' => $user_rank,
        'uid'    => $user_id
    ]);

总的来说,命名参数绑定非常有效。基本上,菜单项总是必须是活动的,加上(1或2或3 )。例如,仪表板被接受为共享弹格。否则就会有一些排名检查。

现在,我一直在努力使用雄辩的查询生成器=/我不认为建立一个关系是不必要的,因为我只将它用于菜单和中间件。在本例中,f_user_access表只包含admin_item_id和user_id,并不真正用作支点,也不在其他任何地方使用。

代码语言:javascript
复制
    $items =
    $this->where( 'active', 1 )
         ->where( function ($query) {

              $query->whereIn( 'slug', $this->shared_slugs )
                    ->orWhere(function ($query) {

                        $query->whereRaw( $this->threshold_rank.' <= '.$this->user_rank )
                              ->whereIn('id', function ($query) {

                                  $query->select('admin_item_id')->from('f_user_access')->where('user_id', $this->user_id)->get();
                              });
                     })
                     ->orWhere(function ($query) {

                        $query->whereRaw( $this->threshold_rank.' > '.$this->user_rank )
                              ->where( 'rank', '>=', $this->user_rank );
                     });
         })->orderBy( 'order', 'ASC' )->get();

我喜欢的第二个例子是,我可以将$shared_slugs作为数组传递,我不需要首先将它转换为字符串。但除此之外,我真的很讨厌(函数($query){})等.最重要的是传递给这个函数的$ids在where.functions中是不可访问的,所以我必须首先在类中定义它们。

第一个是我喜欢的,因为有了命名的绑定,它读起来并没有那么糟糕:S,而且vars也是可访问的。缺点是,我必须调用这个函数来将共享的段塞转换为数组。

不使用雄辩的提问者真的有那么糟糕吗?至少在某些情况下..。你们会怎么做才能使第二个例子更好呢?

最新情况:

由于答案和反馈,我放弃了原始sql。当前函数中包含5个作用域,并为user_access创建了一个(小)模型。

代码语言:javascript
复制
    $items =
    $this->active() //Only active items AND... 1, 2 or 3

        ->where( function ($query) {

            $query->shared_slug()             //  1

            ->orWhere(function ($query) {      // OR  2
                $query->access_required()
                ->whereIn('id', UserAccess::get_access( $this->user_id ) );
            })

            ->orWhere(function ($query) {      // OR  3
                $query->no_access_required()
                ->whereRaw( 'rank >= '.$this->user_rank );
            });

        })->ASC()->get(); 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-16 19:21:24

使用查询生成器的主要好处是它将您从您所选择的存储所使用的语言(即MySQL、Oracle、SQLite等)中抽象出来。如果您切换了数据库类型,则可能需要大量重构原始SQL。相信我,当你开始做一个项目并且了解到这是事实的时候,这是不太好的。

然而,总有一些警告,这也正是为什么雄辩者也有能力处理原始陈述的原因。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44596468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档