2016-09-12 8 views
1

私は現在、多くのテーブルを持っていますが、簡単にするために、2つの影響を受けるテーブルを示します。 Laravel eloquent relationshipユーザーIDの問題

  • あるユーザが多くのアナウンスを持つことができ、1だけが一人のユーザに属して発表する発表

    • ユーザー:彼らは、で構成されています。それは多対1の関係のように思える(または私は考える)。データベースの

      スキーマの作成:モデルも非常に簡単です

      Schema::create('X_USER', function($table) 
          { 
           $table->increments('id'); 
           $table->string('name'); 
           $table->string('email')->unique(); 
           $table->string('password', 60); 
           $table->rememberToken(); 
           $table->timestamps(); 
          }); 
      
      Schema::create('X_ANNOUNCE', function (Blueprint $table) 
          {   
           $table->increments('id'); 
           $table->integer('created_by')->unsigned(); 
           $table->foreign('created_by')->references('id')->on('X_USER')->onDelete('cascade'); 
           $table->timestamps(); 
          }); 
      

      は、今私はユーザーモデルでこれを持っている:

      public function announces() 
      { 
          return $this->hasMany('App\Announce', 'created_by'); 
      } 
      

      そしてこのモデルを発表

      public function user() 
      { 
          return $this->belongsTo('App\User', 'created_by'); 
      } 
      

      私は私laravelのAnnounceController.php(ストア機能)上で次の操作を行い発表挿入します

      $announce = Announce::create($request->all()); 
      
      return Response::json([ 
            'message' => 'Announce Created Succesfully', 
            'data' => $this->transform($announce) 
          ]); 
      

      この前の行は、実際に正しくデータベース内のすべてを挿入します。これまでのところ何も間違っていない私は、私はフロントエンドに渡したいでしょう形式でJSONを返す「変革」かまで:私は$user = Announce::find($announce['created_by'])->userを行うと

      private function transform($announce) 
      { 
          //Get User 
          $user = Announce::find($announce['created_by'])->user; 
      
          return [ 
            'announce_id'   => $announce['id'], 
            'announce_title'   => $announce['title'], 
            'announce_user_id'  => $user->id, 
            'announce_created_by' => $user->name, 
           ]; 
      } 
      

      私は正しいID(する$ user-> IDを取得することはありません)。しかし、$ user-> idと$ user-> nameは一貫性があり、正しいものではありません。 id($ announce ['created_by'])も正しいことを確認しました。

      私はこの質問が最高の質問ではないことを理解していますが、スタックやチュートリアルをチェックして長時間試してみるといいでしょう。

    答えて

    0

    あなたがidで検索しているfind方法を使用している、と私は仮定し、正しい方法は次のようになります。

    $user = Announce::where('created_by', $announce['created_by'])->first()->user; 
    

    しかし、実際にはそれが理由transform方法のために、私が思うに、ここであまり意味がありません。このようなコードを使用するのに十分でなければなりません。また

    あなたがtranform方法のために、このようなコードを使用することができるはずです。

    private function transform($announce) 
    { 
        return [ 
          'announce_id'   => $announce->id, 
          'announce_title'   => $announce->title, 
          'announce_user_id'  => $announce->user->id, 
          'announce_created_by' => $announce->user->name, 
         ]; 
    } 
    
    +0

    あなたの最初の提案で** Undefinedプロパティ:Illuminate \ Database \ Eloquent \ Builder :: $ user **を得ました。 2番目に**非オブジェクト**のプロパティを取得しようとしています。 今のところうまくいきませんでしたが、ヒントのためにありがとうございます – Xelnag

    +0

    @Xelnag私は最初の方法を更新しましたが、おそらくこの方法では動作しません。 2番目の例では、 '$ announce-> user-> id'の代わりに、それぞれのアナウンスに対してユーザーが設定されていることを確認してください。' $ announce-> user?$ announce-> user-> id: 'no user'と名前は同じ –

    +0

    私は最初のものを試してみましたが実際には動作しますが、 ' - > first()'関数を使わないと "id"にマッチします。 2番目のものについては、ちょうどうまくいきません、私はそれらのすべてが空ではないことを確かめ、そのインラインIFを置くことさえできませんでした。 – Xelnag