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

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回答

4316閲覧

laravel フォローしている人だけの情報を取得する場合

hina0823

総合スコア15

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クリップ

投稿2020/10/18 09:13

前提・実現したいこと

laravelを使いTwitter風WEBアプリを作成しています。
フォローしているユーザーのつぶやきなどを表示させたいと思っているのですが、ログインしているユーザーの情報も表示されてしまいます。
該当ソースコード

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 | | +------------+------------------+------+-----+---------+----------------+

試したこと

dd($timelines); で値を確認したところログインしているユーザーも含まれていました。
なのでPostモデルのgetTimelinesの記述を工夫する必要があると思い

php

1public function getTimeLines(Int $user_id) 2 { 3 return $this->where('user_id','<>', $user_id)->orderBy('created_at', 'DESC')->paginate(); 4 }

上記の記述のようにしたところフォローしているしていないに限らずログインしているユーザー以外のつぶやきを取得できました。

バージョン

laravel 5.5.48
php 7.4.5
homestead

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

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

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

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

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

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

firegrape

2020/10/18 10:17

FollowsController.php ものせてほしいです。
hina0823

2020/10/18 10:55

修正依頼ありがとうございます。 FollowsControllerは該当ソースコードの一番最初に記載しているので ご確認いただければ幸いです。
firegrape

2020/10/18 11:07

ありがとうございます。 まず、以下の左辺の2つの変数は何が入っていますか? $follow_ids = $follow->followingIds($user->id); $following_ids = $follow_ids->pluck('followed_id')->toArray();
hina0823

2020/10/18 11:50

dd($follow_ids); でフォローしているユーザーを取得できました。 Collection {#237 ▼ #items: array:1 [▼ 0 => Follow {#235 ▼ #fillable: array:2 [▼ 0 => "following_id" 1 => "followed_id" ] #connection: "mysql" #table: null #primaryKey: "id" #keyType: "int" +incrementing: true #with: [] #withCount: [] #perPage: 15 +exists: true +wasRecentlyCreated: false #attributes: array:4 [▼ "id" => 43 "following_id" => 1 "followed_id" => 2 "created_at" => "2020-10-18 09:25:59" ] #original: array:4 [▼ "id" => 43 "following_id" => 1 "followed_id" => 2 "created_at" => "2020-10-18 09:25:59" ] #changes: [] #casts: [] #dates: [] #dateFormat: null #appends: [] #dispatchesEvents: [] #observables: [] #relations: [] #touches: [] +timestamps: true #hidden: [] #visible: [] #guarded: array:1 [▶] } ] } dd($following_ids); で誰をフォローしているのか(followed_id)を取得できました。 array:1 [▼ 0 => 2 ]
firegrape

2020/10/18 11:57

はい、でフォローしている人だけの情報を取得したいなら、 postテーブルとfollowsテーブルをJOINしないといけないと思いますが、 していますか?
hina0823

2020/10/18 12:29

なるほど、そういうことでしたか… FollowモデルにPostテーブルとの一対多のリレーションを書いてFollowControllerで使うか、FollowControllerで直接joinを使って結合させるかのどちらかの方法でやるという認識で間違いないでしょうか?
firegrape

2020/10/18 12:40

はい、そんな感じで大丈夫だと思います。
hina0823

2020/10/18 12:54

ご回答ありがとうございます。 やってみたいと思います。
guest

回答1

0

自己解決

Postモデルの $follow_ids[] = $user_id; を削除したところ、私の意図している表示になりました。

投稿2020/10/26 13:29

hina0823

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問