2017-05-19 5 views
-1

ここでLaravelの問題が発生しています。laravel addEagerConstraints on hasOne

私は3つのモデルを持っている:

  • をsender_idを

    通知

    • ID
    • メッセージが...など
  • をrecipient_id

    参加

    • ID
    • USER_IDなど
    • ..

    ユーザ

    • ID
    • など。

    通知は、参加者テーブルを参照し、両方の送信者(SENDER_ID)と受信者(recipient_id)を有することができます。 参加者にはuser(user_id)への参照があります。

    以下のコードで送信者と受信者の両方の通知のリストを取得しようとしています。

    public function sender() 
    { 
        return $this->hasOne('App\Models\Participant', 'sender_id', 'id')->with(['user']); 
    } 
    
    public function recipient() 
    { 
        return $this->hasOne('App\Models\Participant', 'id', 'recipient_id')->with(['user']); 
    } 
    

    これは、空の結果 戻り[関係:保護] =>配列 ( [差出人] => [受信者] => )

    にコードを変更:

    public function sender() 
    { 
        return $this->hasOne('App\Models\Participant', 'sender_id', 'id')->with(['user'])->first(); 
    } 
    
    public function recipient() 
    { 
        return $this->hasOne('App\Models\Participant', 'id', 'recipient_id')->with(['user'])->first(); 
    } 
    

    私は

    は、すべての

  • +0

    まず、なぜrecipient()に2つの関数があるのですか? –

    +0

    間違えて、私は最初の投稿を修正しました。 – quibuz

    答えて

    0

    あなたの関係は正しく設定されていません。notificationsテーブルは外部キー(sender_idrecipient_id)を持っているので、NotificationParticipantに属し、Participantは1つ以上のNotificationsを持つと言われています。あなたが作る、あなたの参加者/利用者の関係を示さなかったので

    1. public function sender() 
      { 
          return $this->belongsTo(Participant::class); 
      } 
      
      public function recipient() 
      { 
          return $this->belongsTo(Participant::class); 
      } 
      

      カップルのノート:あなたはbelongsTo関係するNotificationモデルにあなたの関係を更新する必要があり

      「参加者はユーザーに属し、ユーザーには1人または複数の参加者がある」と定義されていることを確認してください。それがあなたのデータベースのセットアップ方法です。

    2. リレーションシップメソッドがRelationインスタンスを返す必要があるため、2回目の試行(「未定義メソッドへの呼び出し」)でエラーが発生しました。 first()を呼び出すと、実際にクエリを実行していて、許可されていないModelが返されました。

    +0

    ありがとう!それはトリックでした! – quibuz

    0

    第一「)(\未定義のメソッドを照らし\データベースにクエリ\ビルダー:: addEagerConstraintsを呼び出し、」クリーンなモデルを維持し、ただそこに関係のロジックを記述します。

    public function sender() 
    { 
        return $this->hasOne('App\Models\Participant'); 
    } 
    public function recipient() 
    { 
        return $this->hasOne('App\Models\Participant'); 
    } 
    

    は今、あなたのコントローラでは、あなたは論理を書く:

    $sender = YourModel::sender()->where('sender_id', $id)->first(); 
    

    は、この情報がお役に立てば幸いです。

    +0

    こんにちはTanvir。 参加者モーダルにはsender_idはありません。通知モーダルは行います。参加者のモーダルへの参照として。 クリーナーモーダルについて:送信者と受信者の両方の通知のリストが必要な場合は、おそらくこの権利が必要になります: 通知::と(['送信者'、 '受信者'))? この場合、私のモーダルも正しいと思います。 – quibuz