Php laravel转换为字符串mysql
我用laravel编写了这段代码,我想知道如何在不使用laravel的情况下用纯SQL编写它,就像这样Php laravel转换为字符串mysql,php,mysql,sql,laravel,Php,Mysql,Sql,Laravel,我用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(
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);
});
大概是这样的:
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
Media::skip(2 * 30)->take(30)->toSql();
使用toSql
方法
Laravel查询生成器有一个名为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,您将得到如下结果:
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
Media::skip(2 * 30)->take(30)->toSql();
从介质限制30偏移量60中选择*
现在,对于实际查询,您可以使用以下内容查看第3页的结果SQL字符串(作为示例):
或者,您可以在
AppServiceProvider
中设置事件侦听器,并记录应用程序执行的每个SQL查询
public function boot()
{
\DB::listen(function ($query) {
\Log::debug($query->sql);
\Log::debug($query->bindings);
\Log::debug($query->time);
});
}