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

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

新規登録して質問してみよう
ただいま回答率
85.50%
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

解決済

2回答

1699閲覧

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/17 13:46

前提・実現したいこと

タイトルの通りログインしているユーザーがフォローしているつぶやき一覧機能の実装をしたいと考えています。
ログインしているユーザーでフォローしているユーザーの取得と誰がフォローしている関係なしにフォローしているという条件でつぶやき一覧表示する記述はできました。
この二つの記述を合わせられれば良いのですが、分からず質問させていただきます。

ログインしているユーザーでフォローしているユーザーの取得の記述

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\Follow; 9 10class FollowsController extends Controller 11{ 12 13public function followList(Follow $follow) 14 { 15 $user = auth()->user(); 16 $follow_ids = $follow->followingIds($user->id); 17 dd($follow_ids); 18 } 19}

誰がフォローしている関係なしにフォローしているという条件でつぶやき一覧の記述

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\Follow; 9 10class FollowsController extends Controller 11{ 12 13public function followList() 14 { 15 $timelines = \DB::table('follows') 16 ->join('posts','posts.user_id','=','follows.followed_id') 17 ->get(); 18 return view('follows.followList',['timelines' => $timelines]); 19 } 20}

該当ソースコード

Followモデル

php

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

ルート

php

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

followsテーブル

php

1<?php 2 3use Illuminate\Support\Facades\Schema; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Database\Migrations\Migration; 6 7class CreateFollowsTable extends Migration 8{ 9 /** 10 * Run the migrations. 11 * 12 * @return void 13 */ 14 public function up() 15 { 16 Schema::create('follows', function (Blueprint $table) 17 { 18 $table->increments('id')->autoIncrement(); 19 $table->integer('following_id')->unsigned(); 20 $table->integer('followed_id')->unsigned(); 21 $table->timestamp('created_at')->useCurrent(); 22 23 $table->index('following_id'); 24 $table->index('followed_id'); 25 26 $table->unique(['following_id','followed_id']); 27 }); 28 } 29 30 31 32 /** 33 * Reverse the migrations. 34 * 35 * @return void 36 */ 37 public function down() 38 { 39 Schema::dropIfExists('follows'); 40 } 41}

postsテーブル

php

1<?php 2 3use Illuminate\Support\Facades\Schema; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Database\Migrations\Migration; 6 7class CreatePostsTable extends Migration 8{ 9 /** 10 * Run the migrations. 11 * 12 * @return void 13 */ 14 public function up() 15 { 16 Schema::create('posts', function (Blueprint $table) 17 { 18 $table->increments('id')->autoIncrement(); 19 $table->integer('user_id')->unsigned(); 20 $table->string('post',500); 21 $table->timestamps(); 22 23 $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade'); 24 }); 25 } 26 27 /** 28 * Reverse the migrations. 29 * 30 * @return void 31 */ 32 public function down() 33 { 34 Schema::dropIfExists('posts'); 35 } 36} 37

バージョン

laravel 5.5.48
php 7.4.5
homestead

そもそもフォローしているユーザーのつぶやき一覧の表示は上記のやり方で合っているのでしょうか。
もし考え方が間違えている、もっといい方法があるなどありましたら重ねてご教授いただければ幸いです。

以上、よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

まずリレーションのドキュメントをよく読む。
https://readouble.com/laravel/5.5/ja/eloquent-relationships.html
(リレーション周りはそんなに変わってないけど5.5はすでにサポート期間終了してるので6以上を使ったほうがいい)

UserとUserの多対多。
followsが中間テーブル?
正しく設定できればこんな感じで取得できる。

$posts = $user->follows()->posts;

Has Many Throughも使えば直接フォロー先のpostも取得できるはず。

$timelines = $user->timelines;

ただしかなり複雑なので自分で試行錯誤しないと身に付かない。

投稿2020/10/18 01:56

kawax

総合スコア10377

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

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

0

自己解決

Followモデル

php

1public function followingIds(Int $user_id) 2 { 3 return $this->where('following_id', $user_id)->get(); 4 }

Postモデル

php

1public function getTimeLines(Int $user_id, Array $follow_ids) 2 { 3 // 自身とフォローしているユーザIDを結合する 4 $follow_ids[] = $user_id; 5 return $this->whereIn('user_id', $follow_ids)->orderBy('created_at', 'DESC')->paginate(50); 6 }

FollowsController

php

1public function followList(Post $post, Follow $follow) 2 { 3 $user = auth()->user(); 4 $follow_ids = $follow->followingIds($user->id); 5 $following_ids = $follow_ids->pluck('followed_id')->toArray(); 6 $timelines = $post->getTimelines($user->id, $following_ids); 7 return view('follows.followList',['timelines' => $timelines]); 8 }

こうしたところ取得できました。ありがとうございます。

投稿2020/10/18 02:20

hina0823

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問