ホームページ  >  記事  >  PHPフレームワーク  >  laravelがクリックハウスクエリを使用する場合の「列が見つからない」問題を解決する

laravelがクリックハウスクエリを使用する場合の「列が見つからない」問題を解決する

藏色散人
藏色散人転載
2022-10-31 16:00:313037ブラウズ

次のコラム Laravel チュートリアル では、laravel でクリックハウスクエリを使用することで発生する「DB::Exception: Missing columns」問題について紹介します。

使用 clickhouse 特別な注意: このように書くことはできません。

   $where = [];
    if($cookieId) {
        $where['cookie_id'] = $cookieId;
    }        
    if($host) {
        $where['host'] = $host;
    }        
    if($uri) {
        $where['uri'] = $uri;
    }
    $builder = DB::connection('clickhouse')
        ->table((new AccessLogs)->getTable())
        ->where($where);
    if(!empty($startTime)) {
        $builder->where('create_time', '>=', $startTime);
    }
    if(!empty($endTime)) {
        $builder->where(&#39;create_time&#39;, &#39;<=&#39;, $endTime);
    }

複数の条件でクエリを実行すると、$where 配列が SQL のフィールドとして扱われるため、DB::Exception: Missing columns: '2022-09-27 13:00:49' '2022 が発生します。 -09-27 16:00:49' クエリの処理中にエラーが発生しました。

次のように最適化します:

   $builder = DB::connection(&#39;clickhouse&#39;)
        ->table((new AccessLogs)->getTable());
    if(!empty($cookieId)) {
        $builder->where(&#39;cookie_id&#39;, $cookieId);
    }        
    if(!empty($host)) {
        $builder->where(&#39;host&#39;, $host);
    }        
    if(!empty($uri)) {
        $builder->where(&#39;uri&#39;, $uri);
    }
    if(!empty($startTime)) {
        $builder->where(&#39;create_time&#39;, &#39;>=&#39;, $startTime);
    }
    if(!empty($endTime)) {
        $builder->where(&#39;create_time&#39;, &#39;<=&#39;, $endTime);
    }

は正しくクエリを実行できます。

もう 1 つ言及しておきたい点: コマンド ラインでクエリを実行する場合は、パラメーター値に一重引用符を使用します。二重引用符を使用すると、パラメーター値もフィールドとして扱われます:

#正しい操作は次のとおりです:

select * from access_log where create_time >= ‘2022-09-27 13:00:49’ and create_time <= ‘2022-09-27 16:00:49’ order by create_time desc limit 10;

以上がlaravelがクリックハウスクエリを使用する場合の「列が見つからない」問題を解決するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。