在laravel查询构建器中,如何为父表中的每个记录获取满足一定条件的子行数?

时间:2018-11-07 16:30:45

标签: laravel laravel-query-builder

我有一个users表和一个messages表,该表存储用户彼此发送的消息。 用户表:

-------------------
|id|name  |lastName|
|------------------|
|1 |emma  |watson  |
|2 |taylor|swift   |
|3 |tiger |woods   |

按摩台:

|id|messageBody|from_id|to_id|isRead|
|-----------------------------------|
|1 |...        |1      |2    |0     |
|2 |...        |2      |3    |1     |
|3 |...        |1      |3    |0     |

我要寻找的是获取所有用户的列表以及他们已发送给当前用户的未读邮件数,在laravel中,它们是通过auth()-> user()到达的。 我意识到对此的sql查询是这样的:

SELECT users.id,users.name,users.lastName,(select count(*)
from messages where messages.from_id = users.id and messages.to_id =1 and 
messages.isRead = 0) as countOfNewMessages FROM users

但是如何使用laravel的查询生成器来达到此结果?

2 个答案:

答案 0 :(得分:1)

经典方法是

// messages
$messages = Messages::where('isRead',0)->where('to_id',auth()->user()->id)->get();

//count of messages

$count = $messages->count();

但是您也可以使用relations来获取有关用户及其人数的消息。 请关注Laravel:Relations

答案 1 :(得分:0)

在您的消息模型上

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

在您的控制器上

//For All Data
$messages = Messages::with('user')->where(['isRead'=>0,'to_id'=>1])->get();
//For Count Data
you can easily check how much unread message by `count($messages)`