Php 将SQL查询转换为查询生成器样式

Php 将SQL查询转换为查询生成器样式,php,mysql,laravel,octobercms,Php,Mysql,Laravel,Octobercms,几天来,我一直在努力理解如何在laravel中将SQL查询转换为查询生成器样式 我的SQL查询是: $tagid = Db::select("SELECT `id` FROM `wouter_blog_tags` WHERE `slug` = '".$this->param('slug')."'"); $blog = Db::select("SELECT * FROM `wouter_blog_posts` WHERE `publish

几天来,我一直在努力理解如何在laravel中将SQL查询转换为查询生成器样式

我的SQL查询是:

$tagid = Db::select("SELECT `id` FROM `wouter_blog_tags` WHERE `slug` = '".$this->param('slug')."'");

$blog = Db::select("SELECT * 
            FROM `wouter_blog_posts` 
            WHERE `published` IS NOT NULL 
            AND `published` = '1'
            AND `published_at` IS NOT NULL 
            AND `published_at` < NOW()
            AND (

            SELECT count( * ) 
            FROM `wouter_blog_tags` 
            INNER JOIN `wouter_blog_posts_tags` ON `wouter_blog_tags`.`id` = `wouter_blog_posts_tags`.`tags_id` 
            WHERE `wouter_blog_posts_tags`.`post_id` = `wouter_blog_posts`.`id` 
            AND `id` 
            IN (
             '".$tagid[0]->id."'
            )) >=1
            ORDER BY `published_at` DESC 
            LIMIT 10 
            OFFSET 0");
我现在要转换为查询生成器的地方是:

   $test = Db::table('wouter_blog_posts')
->where('published', '=', 1)
->where('published', '=', 'IS NOT NULL')
->where('published_at', '=', 'IS NOT NULL')
->where('published_at', '<', 'NOW()')
  ->select(Db::raw('count(*) wouter_blog_tags'))
->join('wouter_blog_posts_tags', function($join)
{ 
$join->on('wouter_blog_tags.id', '=', 'wouter_blog_posts_tags.tags_id')
->on('wouter_blog_posts_tags.post_id', '=', 'wouter_blog_posts.id')
->whereIn('id', $tagid[0]->id);
})
->get();
我已经读到我不能在连接中使用where。我现在得到的错误是:

调用undefined方法Illumb\Database\Query\JoinClause::其中


我真的不知道如何将SQL转换为查询生成器。我希望当我看到查询的良好转换时,我能够理解下次如何进行转换。

以下查询生成器代码将为您提供DB::select中的确切SQL查询:

在创建更复杂的查询时,我的过程是首先创建它们,并在SQL环境中进行尝试,以确保它们能够以无定向方式工作。然后,我使用查询生成器一步一步地实现它们,但我没有在查询结束时使用get,而是使用toSql,它将为查询生成器生成的查询提供一个字符串表示形式,允许我将其与原始查询进行比较,以确保其相同。

这项工作对我来说:

DB::表'wouter_blog_posts' ->whereNotNull'published' ->“出版”的地方,1 ->whereNotNull'published_at' ->whereRaw“发表于<现在' ->其中,选择计数* 来自wouter_博客_标签 内部连接wouter\u blog\u posts\u标签在wouter\u blog\u tags.id=wouter\u blog\u posts\u tags.tags\u id 其中wouter\u blog\u posts\u tags.post\u id=wouter\u blog\u posts.id 身份证 在里面 “.$tagid。” >=1 ->orderBy'published_at','desc' ->滑雪 ->吃10 ->分页$this->property'postsPerPage'


我还没有尝试过这个,但可能会使用->whereRaw'id IN?,[$tagid[0]->id]。只需确保末尾的bindings参数是一个数组。但是,我不知道为什么要对一个值使用WHERE-IN-$tagid[0]->id。这会返回数组还是其他什么?这里有一个替代解决方案,查询生成器的工作方式与我预期的完全不同。我不明白:->'1',这是我的错误,我没有注意到,因为我颠倒了条件,where方法的第一个参数被引用,因为它需要一列。我已经更新了我的答案,使用DB::raw解决了这个问题。
DB::table('wouter_blog_posts')
    ->whereNotNull('published')
    ->where('published', 1)
    ->whereNotNull('published_at')
    ->whereRaw('`published_at` < NOW()')
    ->where(DB::raw('1'), '<=', function ($query) use ($tagid) {
        $query->from('wouter_blog_tags')
            ->select('count(*)')
            ->join('wouter_blog_posts_tags', 'wouter_blog_tags.id', '=', 'wouter_blog_posts_tags.tags_id')
            ->whereRaw('`wouter_blog_posts_tags`.`post_id` = `wouter_blog_posts`.`id`')
            ->whereIn('id', [$tagid[0]->id]);
    })
    ->orderBy('published_at', 'desc')
    ->skip(0)
    ->take(10)
    ->get();