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

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

ただいまの
回答率

89.06%

Userテーブルを紐付けたい(Laravel Eloquent)

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,075

前提・実現したいこと

テキストの投稿システムを作っています。
投稿内容の表示はできました。
ユーザーテーブルと紐付けして投稿者名を表示したいです。
イメージ説明

テーブル定義
イメージ説明

発生している問題

Userテーブルの内容を紐付けができない

該当のソースコード

User.php

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Database\Eloquent\Model;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

Post.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $fillable = [
        'user_id',
        'emoji',
    ];

    public function users()
    {
        return $this->belongsTo(User::class);
    }
}

PostsController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Post;

class PostsController extends Controller
{
    public function index()
    {
        //$posts = Post::orderBy('created_at', 'desc')->get();
        $posts = Post::orderBy('created_at', 'desc')->paginate(10);

        // userテーブルの内容を取得できているか確認
        $p = Post::find(1);
        var_dump($p->users); // nullになる

        return view('posts.index', ['posts' => $posts]);
    }
(以下省略)

試したこと

UserモデルとPostモデルに、hasManyとbelongToを設定

補足情報(FW/ツールのバージョンなど)

PHP 7.1
Laravel 5.5

テーブルの情報(2019/08/24 21:20追記)

mysql> desc posts;
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| user_id    | int(10) unsigned | NO   | MUL | NULL    |                |
| emoji      | text             | NO   |     | NULL    |                |
| created_at | timestamp        | YES  |     | NULL    |                |
| updated_at | timestamp        | YES  |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
mysql> desc users;
+----------------+------------------+------+-----+---------+----------------+
| Field          | Type             | Null | Key | Default | Extra          |
+----------------+------------------+------+-----+---------+----------------+
| id             | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name           | varchar(255)     | NO   |     | NULL    |                |
| email          | varchar(255)     | NO   | UNI | NULL    |                |
| password       | varchar(255)     | NO   |     | NULL    |                |
| remember_token | varchar(100)     | YES  |     | NULL    |                |
| created_at     | timestamp        | YES  |     | NULL    |                |
| updated_at     | timestamp        | YES  |     | NULL    |                |
+----------------+------------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

データ(2019/08/24 21:50追記)

mysql> select * from posts where id = 1;
+----+---------+---------------+---------------------+---------------------+
| id | user_id | emoji         | created_at          | updated_at          |
+----+---------+---------------+---------------------+---------------------+
|  1 |       1 | りんご🍎        | 2019-08-14 11:38:05 | 2019-08-14 11:38:05 |
+----+---------+---------------+---------------------+---------------------+
1 row in set (0.00 sec)

mysql> select * from users where id = 1;
+----+-------+-------------------+--------------------------------------------------------------+--------------------------------------------------------------+---------------------+---------------------+
| id | name  | email             | password                                                     | remember_token                                               | created_at          | updated_at          |
+----+-------+-------------------+--------------------------------------------------------------+--------------------------------------------------------------+---------------------+---------------------+
|  1 | user1 | user1@example.com | $2y$10$oFI7Koi/jEx/ghZhjce4HOEFzQGHcGpTT5xERyNNM9CqF0DY8jOXq | WVygmE7sHrYhSSYQ7fHOQH6kctJJrau0mHSHf2ZhMSqdsz3YvWNF55rJyu85 | 2019-08-14 11:11:54 | 2019-08-14 11:11:54 |
+----+-------+-------------------+--------------------------------------------------------------+--------------------------------------------------------------+---------------------+---------------------+
1 row in set (0.00 sec)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • mikkame

    2019/08/24 23:52

    $p->users()
    をダンプしたらなんか出ますか?

    キャンセル

  • __tutinokobaby

    2019/08/25 01:29

    ↓がでました
    app/Http/Controllers/PostsController.php:17:
    object(Illuminate\Database\Eloquent\Relations\BelongsTo)[206]
    protected 'child' =>
    object(App\Post)[217]
    protected 'fillable' =>
    array (size=2)
    0 => string 'user_id' (length=7)
    1 => string 'emoji' (length=5)
    protected 'connection' => string 'mysql' (length=5)
    protected 'table' => null
    protected 'primaryKey' => string 'id' (length=2)
    protected 'keyType' => string 'int' (length=3)
    public 'incrementing' => boolean true
    protected 'with' =>
    array (size=0)
    empty
    protected 'withCount' =>
    array (size=0)
    empty
    protected 'perPage' => int 15
    public 'exists' => boolean true
    public 'wasRecentlyCreated' => boolean false
    protected 'attributes' =>
    array (size=5)
    'id' => int 1
    'user_id' => int 1
    'emoji' => string 'りんご🍎' (length=13)
    'created_at' => string '2019-08-14 11:38:05' (length=19)
    'updated_at' => string '2019-08-14 11:38:05' (length=19)
    protected 'original' =>
    array (size=5)
    'id' => int 1
    'user_id' => int 1
    'emoji' => string 'りんご🍎' (length=13)
    'created_at' => string '2019-08-14 11:38:05' (length=19)
    'updated_at' => string '2019-08-14 11:38:05' (length=19)
    protected 'changes' =>
    array (size=0)
    empty
    protected 'casts' =>
    array (size=0)
    empty
    protected 'dates' =>
    array (size=0)
    empty
    protected 'dateFormat' => null
    protected 'appends' =>
    array (size=0)
    empty
    protected 'dispatchesEvents' =>
    array (size=0)
    empty
    protected 'observables' =>
    array (size=0)
    empty
    protected 'relations' =>
    array (size=1)
    'users' => null
    protected 'touches' =>
    array (size=0)
    empty
    public 'timestamps' => boolean true
    protected 'hidden' =>
    array (size=0)
    empty
    protected 'visible' =>
    array (size=0)
    empty
    protected 'guarded' =>
    array (size=1)
    0 => string '*' (length=1)
    protected 'foreignKey' => string 'users_id' (length=8)
    protected 'ownerKey' => string 'id' (length=2)
    protected 'relation' => string 'users' (length=5)
    protected 'query' =>
    object(Illuminate\Database\Eloquent\Builder)[201]
    protected 'query' =>
    object(Illuminate\Database\Query\Builder)[207]
    public 'connection' =>
    object(Illuminate\Database\MySqlConnection)[197]
    ...
    public 'grammar' =>
    object(Illuminate\Database\Query\Grammars\MySqlGrammar)[203]
    ...
    public 'processor' =>
    object(Illuminate\Database\Query\Processors\MySqlProcessor)[204]
    ...
    public 'bindings' =>
    array (size=6)
    ...
    public 'aggregate' => null
    public 'columns' => null
    public 'distinct' => boolean false
    public 'from' => string 'users' (length=5)
    public 'joins' => null
    public 'wheres' =>
    array (size=1)
    ...
    public 'groups' => null
    public 'havings' => null
    public 'orders' => null
    public 'limit' => null
    public 'offset' => null
    public 'unions' => null
    public 'unionLimit' => null
    public 'unionOffset' => null
    public 'unionOrders' => null
    public 'lock' => null
    public 'operators' =>
    array (size=29)
    ...
    public 'useWritePdo' => boolean false
    protected 'model' =>
    object(App\User)[216]
    protected 'fillable' =>
    array (size=3)
    ...
    protected 'hidden' =>
    array (size=2)
    ...
    protected 'connection' => string 'mysql' (length=5)
    protected 'table' => null
    protected 'primaryKey' => string 'id' (length=2)
    protected 'keyType' => string 'int' (length=3)
    public 'incrementing' => boolean true
    protected 'with' =>
    array (size=0)
    ...
    protected 'withCount' =>
    array (size=0)
    ...
    protected 'perPage' => int 15
    public 'exists' => boolean false
    public 'wasRecentlyCreated' => boolean false
    protected 'attributes' =>
    array (size=0)
    ...
    protected 'original' =>
    array (size=0)
    ...
    protected 'changes' =>
    array (size=0)
    ...
    protected 'casts' =>
    array (size=0)
    ...
    protected 'dates' =>
    array (size=0)
    ...
    protected 'dateFormat' => null
    protected 'appends' =>
    array (size=0)
    ...
    protected 'dispatchesEvents' =>
    array (size=0)
    ...
    protected 'observables' =>
    array (size=0)
    ...
    protected 'relations' =>
    array (size=0)
    ...
    protected 'touches' =>
    array (size=0)
    ...
    public 'timestamps' => boolean true
    protected 'visible' =>
    array (size=0)
    ...
    protected 'guarded' =>
    array (size=1)
    ...
    protected 'rememberTokenName' => string 'remember_token' (length=14)
    protected 'eagerLoad' =>
    array (size=0)
    empty
    protected 'localMacros' =>
    array (size=0)
    empty
    protected 'onDelete' => null
    protected 'passthru' =>
    array (size=12)
    0 => string 'insert' (length=6)
    1 => string 'insertGetId' (length=11)
    2 => string 'getBindings' (length=11)
    3 => string 'toSql' (length=5)
    4 => string 'exists' (length=6)
    5 => string 'doesntExist' (length=11)
    6 => string 'count' (length=5)
    7 => string 'min' (length=3)
    8 => string 'max' (length=3)
    9 => string 'avg' (length=3)
    10 => string 'sum' (length=3)
    11 => string 'getConnection' (length=13)
    protected 'scopes' =>
    array (size=0)
    empty
    protected 'removedScopes' =>
    array (size=0)
    empty
    protected 'parent' =>
    object(App\Post)[217]
    protected 'fillable' =>
    array (size=2)
    0 => string 'user_id' (length=7)
    1 => string 'emoji' (length=5)
    protected 'connection' => string 'mysql' (length=5)
    protected 'table' => null
    protected 'primaryKey' => string 'id' (length=2)
    protected 'keyType' => string 'int' (length=3)
    public 'incrementing' => boolean true
    protected 'with' =>
    array (size=0)
    empty
    protected 'withCount' =>
    array (size=0)
    empty
    protected 'perPage' => int 15
    public 'exists' => boolean true
    public 'wasRecentlyCreated' => boolean false
    protected 'attributes' =>
    array (size=5)
    'id' => int 1
    'user_id' => int 1
    'emoji' => string 'りんご🍎' (length=13)
    'created_at' => string '2019-08-14 11:38:05' (length=19)
    'updated_at' => string '2019-08-14 11:38:05' (length=19)
    protected 'original' =>
    array (size=5)
    'id' => int 1
    'user_id' => int 1
    'emoji' => string 'りんご🍎' (length=13)
    'created_at' => string '2019-08-14 11:38:05' (length=19)
    'updated_at' => string '2019-08-14 11:38:05' (length=19)
    省略

    キャンセル

  • mikkame

    2019/08/25 17:23

    何かしら出てくればリレーションの設定は正しそうですね(Typoとかなし)

    キャンセル

まだ回答がついていません

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

  • ただいまの回答率 89.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る