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

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

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

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

PHP

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

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

1回答

2452閲覧

laravel テーブルを結合させてログインしているユーザーでフォローしているユーザーのつぶやき表示

hina0823

総合スコア15

Laravel

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

PHP

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

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2020/10/22 14:45

前提・実現したいこと

以前も同じような内容で質問させていただきましたが3日考えても分からず、また質問させていただきます。
前提としてタイトル通りの事をやりたいのですが、ログインしているユーザーのつぶやきも表示されてしまいます。以前の質問ではテーブルを結合すればログインしているユーザー自身のつぶやきは表示されないという回答をいただきましたが、記述が分からずにいます。

以前いただいた回答:https://teratail.com/questions/298781
※解決できていないため、未解決のままにしています。

該当ソースコード

FollowsController

php

1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use Illuminate\Support\Facades\Auth; 7use Illuminate\Support\Facades\DB; 8use App\User; 9use App\Post; 10use App\Follow; 11 12class FollowsController extends Controller 13{ 14 public function followList(Post $post, Follow $follow) 15 { 16 $user = auth()->user(); 17 $follow_ids = $follow->followingIds($user->id); 18 $following_ids = $follow_ids->pluck('followed_id')->toArray(); 19 $timelines = $post->getTimelines($user->id, $following_ids); 20 return view('follows.followList',['timelines' => $timelines]); 21 } 22}

Followモデル

php

1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class Follow extends Model 8{ 9 10 protected $fillable = [ 11 'following_id', 'followed_id' 12 ]; 13 14 public function followingIds(Int $user_id) 15 { 16 return $this->where('following_id', $user_id)->get(); 17 } 18 19}

Postモデル

php

1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class Post extends Model 8{ 9 protected $fillable = [ 10 'user_id', 'post', 11 ]; 12  13 public function getTimeLines(Int $user_id, Array $follow_ids) 14 { 15 $follow_ids[] = $user_id; 16 return $this->whereIn('user_id', $follow_ids)->orderBy('created_at', 'DESC')->paginate(); 17 } 18}

ルート

php

1Route::group(['middleware' => 'auth'], function() { 2Route::get('/followList', 'FollowsController@followList'); 3});

followList.blade

php

1@foreach ($timelines as $timelines) 2 {{ $timelines->user_id }} 3 {{ $timelines->post }} 4@endforeach

followsテーブル

+--------------+------------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+------------------+------+-----+-------------------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | following_id | int(10) unsigned | NO | MUL | NULL | | | followed_id | int(10) unsigned | NO | MUL | NULL | | | created_at | timestamp | NO | | CURRENT_TIMESTAMP | | +--------------+------------------+------+-----+-------------------+----------------+

postsテーブル

+------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | user_id | int(10) unsigned | NO | MUL | NULL | | | post | varchar(500) | NO | | NULL | | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | +------------+------------------+------+-----+---------+----------------+

上記の記述ですとフォローしている人のつぶやきは取得できますが、ログインしているユーザー自身のつぶやきも表示されてしまいます。

試したこと

FollowsController

php

1public function followlist() 2 { 3 $user = \DB::table('follows') 4 ->join('posts','posts.user_id','=','followed_id') 5 ->get(); 6 return view('follows.followList',['user' => $user]); 7 }

FollowsControllerを上記のように記述したところ、どのユーザーがログインしているに限らずすべてのつぶやきが表示されました。つまりfollowsテーブルの中身と結合しているpostsテーブルのすべての値を取得できます。

バージョン

laravel 5.5.48
php 7.4.5
homestead

ご教授の程、宜しくお願い致します。

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

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

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

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

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

phper.k

2020/10/25 04:43

follow テーブルに following_id と followed_id が同じ値になっているものは存在しませんか? select * from follows where following_id = followed_id で確認してみてください。
hina0823

2020/10/25 05:37 編集

ご回答ありがとうございます。 自分自身をフォローしているか確認するという記述でお間違いないでしょうか。 実際に頂いた記述を試したところ、Empty set という結果が返ってきました。 自分自身をフォローして、頂いた記述を試すと当たり前ですが following_id と followed_id には同じ数字が入っています。 Empty set でも自分自身でフォローをしていてもbladeの表示結果は変わりませんでした。
phper.k

2020/10/25 05:54

コードを試すより前に確認しておきtkったから聞きました。 コードの分量がそこそこ多いので、事実を確認しておきたかったのです。
guest

回答1

0

ベストアンサー

Postモデル内で $follow_ids$user_id を追加してクエリを実行しているようですが、これが原因ではないでしょうか。

php

1 public function getTimeLines(Int $user_id, Array $follow_ids) 2 { 3 $follow_ids[] = $user_id; 4 return $this->whereIn('user_id', $follow_ids)->orderBy('created_at', 'DESC')->paginate(); 5 }

投稿2020/10/23 06:13

HRS_O

総合スコア70

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

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

hina0823

2020/10/24 10:25

ご回答ありがとうございます。 Postモデルを public function Follows() { return $this->belongsTo('App\Follow'); } public function getTimeLines($user_id) { return $this ->Follows() ->where('followed_id', $user_id) ->orderBy('created_at', 'DESC') ->paginate(); } 上記のように記述したところ$timelinesの中に値が入っていない状態となりました。結合の記述が違うのは理解したのですが、具体的にどう書けばいいのかが分からずにいます。
HRS_O

2020/10/26 05:49

元々の記述にあった下記では取得出来ませんでしたか? ```php return $this->whereIn('user_id', $follow_ids)->orderBy('created_at', 'DESC')->paginate(); ``` 新しく提示いただいたコードだと実現したいこと異っているように見えます。 また、事前にどのようなSQLが発行されれば期待する値が取得出来るのか事前に自前でクエリを書いて、 toSqlメソッドを利用してご自身の抽出したいSQLになっているか確認したほうが良いと思います。 例えば下記のように記述することで発行されるSQLが取得出来ます。 ```php $this ->Follows() ->where('followed_id', $user_id) ->orderBy('created_at', 'DESC') ->tosql(); ``` それでも結合して取得したい場合は、belongsToの挙動を確認したほうが良いと思います。 詳しくは下記の「逆の関係の定義」以降を確認してみてください。 https://readouble.com/laravel/7.x/ja/eloquent-relationships.html#one-to-many
hina0823

2020/10/26 13:27

ご回答ありがとうございます。 ご指摘を頂いた通り、事実と異なったことを行っていました。申し訳ございません。 元々、POSTモデルの記述にありました $follow_ids[] = $user_id; を消して試したところうまく表示されました。またテーブルを結合させての表示も試してみたいと思います。誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問