代码之家  ›  专栏  ›  技术社区  ›  Daniel Valland Michael Borgwardt

如何在Laravel Jenssegers Mongodb ORM中执行原始查询?

  •  0
  • Daniel Valland Michael Borgwardt  · 技术社区  · 7 年前

    我在和jessenger mongodb一起使用Laravel( https://github.com/jenssegers/laravel-mongodb ),我在mongodb中有以下对象集合:

    用户:(id、姓名、电子邮件)

    消息(from\u id,to\u id,text)

    我需要对这两个集合运行以下查询:

    db.User.aggregate([
       {
         $lookup:
           {
             from: "Message",
             localField: "id",
             foreignField: "from_id",
             as: "user_message"
           }
      }
      ,{$match:{id:1}}
    ])
    

    我想知道的是如何在jesenger laravel(ORM/面向对象风格)中做到这一点。。。通常我会这样做 Message::where('from_id', '=', $user->_id)->get(['to_id']) 。。。。等但是如何运行或转换上述查询?谢谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   Ohgodwhy    7 年前

    在用户模型中,可以使用定义与消息的关系 embedsMany :

    /**
     * messages that were received by the user
     */
    public function messagesSent() 
    {
        return $this->hasMany(User::class, 'from_id');
    }
    
    
    /**
     * Messages that were sent to the user
     */
    public function messagesReceived() 
    {
        return $this->hasMany(User::class, 'to_id');
    }
    

    您还需要在 messages 用于指示 sender/receiver 是,以便您可以立即加载这些:

    public function sender()
    {
        return $this->belongsTo(User::class, 'from_id');
    }
    

    您还可以定义接收器:

    public function receiver()
    {
        return $this->belongsTo(User::clas, 'to_id');
    }
    

    现在,如果您想从上到下查看最新消息,请不要使用 User 要定义此模型,请从 Message 模型,这样您就不会在尝试按关系排序时陷入困境,而在您的情况下,更容易不:

    Message::with(['sender'])
        ->where('from_id', $user->id)
        ->limit(20)
        ->orderBy('created_at')
        ->take(50);
    

    如果您只想让用户的所有消息 senders 已加载关系:

    User::with(['messagesReceived', 'messagesReceived.sender'])
        ->where('id', $user_id)
        ->firstOrFail();