【问题标题】:laravel convert to string mysqllaravel 转换为字符串 mysql
【发布时间】:2023-03-05 05:08:01
【问题描述】:

我使用 laravel 编写了这段代码,我想知道如何在不使用 laravel 的情况下用纯 SQL 编写它?

    Route::get('popular', function(){

    $media = Media::where('active', '=', '1')->join('media_likes', 'media.id', '=', 'media_likes.media_id')->groupBy('media_likes.media_id')->orderBy(DB::raw('COUNT(media_likes.id)'), 'DESC')->select('media.*')->paginate(30);

    $data = array(
        'media' => $media,
        'categories' => Category::all(),
        'pages' => Page::all(),
        'settings' => Setting::first(),
        );

    return View::make('Theme::home', $data);

});

【问题讨论】:

    标签: php mysql sql laravel


    【解决方案1】:

    使用toSql方法

    Laravel Query builder 有一个有用的方法,叫做 toSql,它可以方便地查看最终 SQL 查询的样子。

    现在,当您调用paginate 方法时,您将获得Paginator,您将无法调用toSql 方法。

    解构paginate

    当你使用paginate 时,Laravel 将对每个$page 进行以下查询:

    // Let's simplify the query for now
    Media::skip(($page - 1) * $perPage)->take($perPage);
    

    知道了,你可以使用查询生成器的方法toSql,你会看到实际的sql字符串。

    假设$page=3$perPage=30,并且表的名称是media,你会得到这样的结果:

    Media::skip(2 * 30)->take(30)->toSql();
    

    select * from media limit 30 offset 60


    现在,对于您的实际查询,您可以使用以下命令查看页面 3 的结果 SQL 字符串(作为示例):

    Media::where('active', '=', '1')
        ->join('media_likes', 'media.id', '=', 'media_likes.media_id')
        ->groupBy('media_likes.media_id')
        ->orderBy(DB::raw('COUNT(media_likes.id)'), 'DESC')
        ->select('media.*')
        ->skip(2 * 30)
        ->take(30)
        ->toSql();
    

    Listening For Query Events

    或者,您可以在AppServiceProvider 中设置事件侦听器,并记录应用程序执行的每个 SQL 查询。

    public function boot()
    {
        \DB::listen(function ($query) {
            \Log::debug($query->sql);
            \Log::debug($query->bindings);
            \Log::debug($query->time);
        });
    }
    

    【讨论】:

      【解决方案2】:
      $media = Media::where('active', '=', '1')->join('media_likes', 'media.id', '=', 'media_likes.media_id')->groupBy('media_likes.media_id')->orderBy(DB::raw('COUNT(media_likes.id)'), 'DESC')->select('media.*')->paginate(30);
      

      类似这样的:

      SELECT m.* 
      FROM
      media m
      JOIN 
      media_likes ml
      ON
      ml.media_id = m.id
      GROUP BY 
      ml.media_id
      ORDER BY
      COUNT(ml.id) DESC
      

      【讨论】:

        猜你喜欢
        • 2014-05-24
        • 1970-01-01
        • 1970-01-01
        • 2022-01-08
        • 2020-08-29
        • 2017-12-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多