###改善の余地があるか知りたいコード
php
1class Article extends Model 2{ 3 4public function countArticleDate() 5 { 6 // articlesテーブルからcreated_atカラムを指定して全件取得(all()で配列化) 7 $created_at_columns = $this->select('created_at')->get()->all(); 8 9 // 取得した件数分、繰り返し処理でフォーマットを変更、空の配列に格納 10 $count = count($created_at_columns); 11 for ($i = 0; $i < $count; $i++) { 12 $created_at[] = $created_at_columns[$i]->created_at->format('Y_m_d'); 13 } 14 // 重複しているデータ(日付)を除外 15 $unique_created_at = array_unique($created_at); 16 // 重複なしのデータ(日付)を数える 17 $count_created_at = count($unique_created_at); 18 // 合計値をコントローラーに渡す 19 return $count_created_at; 20 } 21}
###articlesテーブルの構造とcreated_atカラムの情報
articlesテーブル
id | user_id | body | created_at | updated_at |
---|---|---|---|---|
1 | 1 | テスト | 2021-05-18 11:02:38 | 2021-05-18 11:02:38 |
`created_at` timestamp NULL DEFAULT NULL,
###取得結果(dd()で確認)
created_atカラムの日付データのフォーマット変更時と変更後、重複している日付データの削除後の合計値をdd()で確認
//フォーマットの変更成功 array:2 [▼ 0 => "2021_05_18" 1 => "2021_05_22" ] //count()で合計値の取得成功 2
上記のメソッドは、articlesテーブルからcreated_atカラムの日付データを日付重複なしで取得後、created_atカラム(日付データ)の合計値を取得したいと思い、日付データの重複をなくす為に、繰り返し処理で時刻を削除したフォーマット(年/月/日の状態)に変更した後にarray_unique()
で重複を削除、そしてcount()
で合計値を取得すると考え作成しました。
最終目的としましては、重複なしの日付単位で数えた投稿データの合計値をユーザーの投稿累計日数として表示したいと考えております。
例えば、ログインしているユーザーが、2021-05-18、2021-05-19、2021-05-20という日付データを保持している投稿を各日付ごとに2つずつ投稿していると仮定します。
このような場合、articlesテーブルでは、2021-05-18、2021-05-19、2021-05-20の投稿データが各2つずつ存在しているのでデータ数としては6つあることになると思います。
重複なしの日付単位で考えるとユーザーが投稿しているデータは3つになると思います。この重複なしの日付単位で数えた投稿データ数をユーザーの累計投稿日数として扱いたく、累計投稿日数3日という数をarticlesテーブルから取得したいと思い、上記のようなコードを作成致しました。
投稿している日数の合計値を表示したいユーザーとリレーションしているarticlesテーブルのcreated_atカラムを、一旦全て取得してその件数分の繰り返し処理で、取得したcreated_atカラムの日付データのフォーマットを変更していることが非常に効率が悪いと思っています。私自身の力ではこのコードに対する改善策が思いつきませんでした。
上記コードの改善点、間違い等のアドバイスをいただきたく存じます。
何卒、よろしくお願いします。
###追記
回答者様から、上記のコードは全て間違っているとのご指摘を受けました。
私、独学で学習しておりまして、学習してきたことが正しくないと言われどの箇所が間違っているのか分からない状態です。
指摘を真摯に受け止め、基礎固めからやり直したいと思っておりますので、もし可能であれば少し具体的に間違いをご指摘いただきたく存じます。
何卒、よろしくお願い致します。
###開発環境
laravel 6.20.16
php 7.4.15
MySQL 5.7
回答2件
あなたの回答
tips
プレビュー