質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

1106閲覧

Column not found (いいねした投稿だけ取得したい)

ss-kitagawa

総合スコア0

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2022/04/15 12:22

編集2022/04/15 15:46

Twitterもどきを作成しています。

自分がいいねした投稿だけのデータをページネーションとして取得したいのですが、

->where('posts.is_liked', '=', '1')

部分で下記エラーが表示されてしまいます。

元のテーブルに無いカラムで、一時的に追加しているカラムはwhereでの絞り込みってできないのでしょうか?
少々この場合の別の絞り込み法がわからず教えて頂きたいです、、、

試したこととしては、他のメソッド内で同じようなことをしていて

->where('posts.user_id', '=', $user->id)

こちらはうまくいきました。おそらくuser_idは元テーブルのカラムに存在しておりまして、一時的なカラムとして追加していないためかと思います。

よろしくお願いいたします。

PHP

1  // $userはcontrollerから呼び出す引数です。 2 // ログインユーザーがいいねしている投稿データを取得 3 public function getLikedPost($user) 4 { 5 $count_like = DB::table('likes') 6 ->selectRaw('post_id, count(*) as `count`') 7 ->groupBy('post_id'); 8 9 $new_post = new Post(); 10 11 $liked_posts = $new_post->newQuery() 12 ->leftJoin('likes', function ($query) use ($user) { 13 // いいねされた状態のものを結合 14 // 結合前の結合条件を指定 15 $query->on('posts.id', '=', 'likes.post_id'); 16 // 結合後の条件でデータ絞り込み 17 // (ログインしているユーザのいいね) 18 $query->where('likes.user_id', $user->id); 19 }) 20 ->leftJoinSub($count_like, 'count_like', function ($join) { 21 $join->on('posts.id', '=', 'count_like.post_id'); 22 }) 23 ->selectRaw('posts.*, IFNULL(count_like.`count`, 0) as `count`, posts.id = IFNULL(likes.post_id, 0) as is_liked') 24 ->where('posts.is_liked', '=', '1') 25 ->orderBy('created_at', 'desc') 26 ->paginate(3); 27 // ->get(); 28 29 // リレーション 30 $liked_posts->load('user'); 31 32 // 投稿に紐づくコメント数を取得 33 $liked_posts->each(function ($post) { 34 $post->comment_count = $post->comments()->count(); 35 }); 36 37 return $liked_posts; 38 }

エラー

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'posts.is_liked' in 'where clause' (SQL: select count(*) as aggregate from `posts` left join `likes` on `posts`.`id` = `likes`.`post_id` and `likes`.`user_id` = 1 left join (select post_id, count(*) as `count` from `likes` group by `post_id`) as `count_like` on `posts`.`id` = `count_like`.`post_id` where `posts`.`is_liked` != 1)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

1.Laravelから離れてデータベースやSQLのことを覚える。
2.Laravelでデータベースを使う時はEloquentを使うのが普通。リレーションのドキュメントを何万回でも読む。

Laravelを普通に使ってたら自分でjoinとか滅多に書かなくなる。Laravel内部でSQLが組み立てられてるだけなのでSQLの知識は必要。変なSQLよりLaravelらしいコードから組み立てられたSQLの方がマシ。

php

1$likes = $request->user() 2 ->likes() 3 ->with(['post' => fn($query) => $query->withCount('likes')]) 4 ->latest() 5 ->paginate(3);

php

1@foreach($likes as $like) 2{{ $like->post->likes_count }} 3@endforeach

投稿2022/04/15 13:13

kawax

総合スコア10377

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ss-kitagawa

2022/04/15 15:47 編集

ご回答ありがとうございます! とても勉強になりました! ちなみに、修正したのですが全コード書くと上記のようになってまして フロント側(Vue)にてユーザー情報もリレーションに含めつつさらにコメント数も追加したいといった感じです。 また、returnしたい値にはlikeに紐付いた投稿ではなく、いいねされた投稿全てとそこにuserや必要な情報(いいね数、いいねしているかなどのフラグ)をくっつけて返したいです。 この場合のパターンも上記のように可能でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問