行を削除した時、値が繰り下げされるようにしたい
受付中
回答 3
投稿
- 評価
- クリップ 1
- VIEW 529
やりたい事
①他の文字列を変更した時、sortが変動しないようにしたい
例
sort name
1 ライス 1ライス
2 ラーメン → 2ラーメン
3 スープ 3コーンスープ
4 おそば 4おそば
補足:現状、何かしらの変更を加えると、sortの値が何故か増えていってしまうのです・・・
②行を削除した時、sortが繰り下げされるようにする
(1,2,3,4,5 のうち、3を削除した時、 4,5が繰り下がり、1234となるようにする)
例
sort name
1 ライス 1 ライス
2 ラーメン 2 ラーメン
3 野菜 → 3 スープ
4 スープ 4 おそば
5 おそば
テーブルのsort 1,2,3,4,5 とした時
2を更新し、4に変更した時、3が2に 4が3に、 2が4になるようにする
例
1 ライス 1 ライス
2 ラーメン 2 野菜
3 野菜 → 3 スープ
4 スープ 4 ラーメン
5 おそば 4 おそば
テーブルのsort 1,2,3,4,5 とした時
3を更新し、1に変更した時、1が2に 2が3に 3が1になるようにする
1 ライス 1 野菜
2 ラーメン 2 ライス
3 野菜 → 3 ラーメン
4 スープ 4 スープ
5 おそば 5 おそば
ソース
public function updateSort($id, $sort, $old_sort,$delete = false){
$query = $this->model
->where('sort', '>=', $sort)
->where('id', '<>', $id);
if($delete === false){
$query->update(['sort'=>DB::raw('sort+1')]);
}else{
$query->update(['sort'=>DB::raw('sort-1')]);
}
これを使って、こんな感じで実装したいのですが、当方初心者のためもあり、
実現させたい動きになりません。
ご教授の程、宜しくお願い致します。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+1
PHPは分かりませんが、ロジックは以下になると思います。
削除の場合
・削除したsort以降を-1する
update model set sort=sort-1 where sort>[削除したsort]
変更の場合
・変更前および変更後の区間のsortを変更する
その際、変更後の値以上は+1、値未満は-1
update model set sort=sort + case when sort<[変更後のsort] then -1 else 1 end
where sort between [変更前sort] and [変更後sort]
※削除する場合を、[削除したsort]=[変更前sort]、[sortがとりうる値の最大値]=[変更後sort]
とすれば、後半のロジックのみで同じ挙動になります。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
前後の処理含めてやりたいことを書かないと誰にも分からない。
数値だけ変更しようとしてるのが間違いの元っぽいので
sortを1から振り直すように実装すればよさそう。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
まず、sortを詰める必要はない
つまりsortは大きいか小さいかだけ判断すればよいのでいちいち詰めていては無駄sortがかぶる場合はどちらが優先されるか明示的に指定しない限り結果はわかりません
sortカラムをdoubleなどにして2→4ではなく2→3.5のようにかぶらないようにしてください
test
create table tbl (id int primary key,sort double,name varchar(20));
insert into tbl values
(1,1,'ライス'),
(2,2,'ラーメン'),
(3,3,'野菜'),
(4,4,'スープ'),
(5,5,'おそば');
delete from tbl where id=3;
update tbl set sort=(select @a:=@a+1 from (select @a:=0) as dummy) order by sort;
insert into tbl values(6,1.5,'うどん');
update tbl set sort=(select @a:=@a+1 from (select @a:=0) as dummy) order by sort;
update tbl set sort=3.5 where name='ライス';
update tbl set sort=(select @a:=@a+1 from (select @a:=0) as dummy) order by sort;
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.32%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
Orlofsky
2018/11/29 16:54
コードは https://teratail.com/help#about-markdown の[コードを入力]を使ってください。
m6u
2018/11/29 17:17
番号付けなんて、MYSQLに任せればいいのに。SELECT文実行時に自動的にナンバリングする方法とか。https://qiita.com/sand_bash/items/851f08a36381a4f01b75
m6u
2018/11/29 17:20
nameを取得するのにsortの番号を指定して表示するってことは考えないシステムなのかな? Aさんがsort=3のnameを取得して、しばらくしてからBさんがsort=3のnameを取得しても、おなじnameにならない可能性がある仕組みだよね。nameの重複も考慮しない感じですか?
yuyasato0220
2018/11/30 10:51
>>Orlofsky様 失礼致しました。以後気をつけさせていただきます。ありがとうございます
yuyasato0220
2018/11/30 10:54
>>m6u 様 mysql・・・そもそも全般知識がない状態で挑んでいる状況でして・・・申し訳ないです。 頂いた内容を参考にやってみようと思います・・・ありがとうございます。 nameに関しては重複などは大丈夫なんですが。。そもそも簡単にサンプル書いてしまったのが間違いですよね・・・ ECサイトの商品管理マスタをつくってまして;;;ありがとうございます
Orlofsky
2018/11/30 10:59
今から直しては?ここの掲示板はいちど書いた質問も回答も修正できます。