Fippiyのプログラム学習内容アウトプットBlog

日々の学習内容をアウトプットして振り返りを実施する。

Laravel開発、本番環境で書籍情報が削除できていなかったので対応する

本番環境で実際に動作することを確認していた時に、書籍情報が削除できないことが分かりましたので、今回はこの対処を行います。

今回の目的

書籍情報削除を本番環境で正常に動作させる

なぜやるか

本番環境で動作不可事象をなくし、正常に動作させるため

やりたいこと

  • 本番環境で削除できない原因を見つける
  • 本番環境で削除ができるようにする

やったこと

  • 原因を探る
  • 原因を解決する

実施内容

削除不可原因は

countによる判断

本番環境で削除アクションのデバッグをしてみると、countによる数値処理で問題が発生していました。

# ~/app/Http/Controllers/BookController.php

public function destroy($id){
 $have_property = Property::where('bookdata_id', $id)->first();
 if (count($have_property) > 0) {
  $have_book = false;
 } else {
  $have_book = true;
 }
 
 

削除アクションの冒頭部分です。削除前にbookdata_idに対して所有者がいれば削除できないため、$have_bookをfalseにしてバリデーションエラーとして返す処理をしていました。

所有者がいるということは、Property::where検索結果ありとなります。

※後から見直して気がつきましたが、そもそも1件か0件ですから、こんな書き方にすることなかったんですね…。

 

countではなく別の方法にすることにしました。 

調べてみたところこちらを参考にさせて頂きました、ありがとうございます。

 

qiita.com

こちらのサイトと同じエラーが出ていました。

ちなみに、開発環境では0,1と値が取得できていました。しかし、記述がそもそも問題あるので直すべきです。

 

if判断基準を変更する

所有者情報を検索して有無結果から判断すればいいので、countをやめてnullかどうかを判断することにしました。

 

public function destroy($id){
 $have_property = Property::where('bookdata_id', $id)->first();
 if ($have_property == null) {
  $have_book = true;
 } else {
  $have_book = false;
 }
 

$have_propertyに値がなければ所有者はいません。

いなければバリデーションエラーとする必要がないので、trueを返してエラーとはせずに次の処理へ進むといった処理としました。

所有者がいる場合はnullではないので、falseとしてバリデーションエラーが返ってくるながれとなります。 

 

こうすることでcount問題は解決し、本番環境でも正常に書籍情報が削除できるようになりました。

シンプルに書けるべき所はシンプルにするほうが問題も起こらない…のかもしれません。