下記のようなSQL文をEloquentで実行したいのですが、うまくいきません。
対象のデータベースはポスグレです。
対象のテーブル「target_table」を、列「new_sort_key」で並び替え、
新しい「sort_no」を設定するSQLです。
lang
1update target_table t 2set sort_no = sort_dtl.new_sort_no 3from (select sort_no,row_number() over(order by new_sort_key) as new_sort_no 4 from target_table 5 where t_no = 123 6) as sort_dtl 7where t.t_no = 123 8and t.sort_no = sort_dtl.sort_no
以下のようにしたところ、うまく動きませんでした。
php
1class TargetTable extends Model 2{ 3 protected $connection = 'pgsql'; 4 protected $table = 'target_table '; //テーブル名は複数形にしない 5 6・・・・・・・・・・省略・・・・・・・・・・・・ 7 8public function sort() { 9$tno = 123; 10 11$subquery = $this->select('sort_no' 12 , DB::raw('row_number() over(order by new_sort_key) As new_sort_no') 13 ) 14 ->where('t_no ', '=', $tno); 15 16 $this->where('t_no ', '=', $tno) 17 ->joinSub($subquery,'sort_dtl',function($join) { 18 $join->on('target_table .sort_no', '=', 'sort_dtl.sort_no') 19 ; 20 }) 21 ->update(['sort_no' => DB::raw('sort_dtl.new_sort_no')); 22}
全く見当違いのSQLが生成されてしまいました。
update target_table
set sort_no = sort_dtl.new_sort_no
where ctid in (select target_table.ctid from target_table inner join (select sort_no , row_number ( )over ( order by new_sort_no) As new_sort_no from target_table where t_no = 123) as sort_dtl on target_table.sort_no = sort_dtl.sort_no where t_no = 123
となり、sort_dtl用のFROM句エントリがありません
とエラーになっています。
php
1上記でだめだったので、 2$this->where('t_no ', '=', $tno) 3の箇所を 4$this->fromsub($subquery,'sort_dtl') 5・・・ 6と書き換えてもみましたが、update対象のテーブル自体がサブクエリになってしまいNGでした。
恐らく全く見当違いなプログラムになっているとは思います・・・。
Eloquent自体初心者で、頭を抱えている状態です。
sqlを実行するためのEloquentはどのような感じになるか、お知恵をお貸しいただけないでしょうか。
よろしくお願いいたします。
あなたの回答
tips
プレビュー