我想创建类似SQL子查询的别名,所以我可以像普通的SQL字段一样使用它。例如,我有3个表:user
,user_comments
和user_comment_answers
。如果我想了解当前用户评论的所有答案,我会做这样的事情:
SELECT
COUNT(*) as comment_answers_count
FROM user_comment_answers
WHERE user_comment_id IN (SELECT id FROM user_comments WHERE user_id = :id)
现在我想让Laravel将此视为user
表的普通字段,所以我可以简单地做这样的事情:
echo Auth::user()->comment_answer_count
或者像这样
$popularUsers = User::where('comment_answer_count', '>=', 100)
如何在Laravel 5.4中实现这一目标?
答案 0 :(得分:2)
尝试
$users = Auth::withCount('comments')->get();
现在所有用户都拥有comments_count
属性
foreach($users as $user) {
echo $user->comments_count;
}
假设您在User
和Comment
模型中定义了关系。
<强>更新强>
根据您的第一条评论,您想要的是一个访问者
public function getCommentAnswerCountAttribute($value) {
//define your query here
}
此处有更多信息:https://laravel.com/docs/5.4/eloquent-mutators#defining-an-accessor
希望这能为您提供寻找解决方案的提示
答案 1 :(得分:0)
结束了这样的SQL View创建:
CREATE VIEW user_with_comments AS
SELECT user.*, (
SELECT
COUNT(*)
FROM user_comment_answers
WHERE user_comment_id IN (SELECT id FROM user_comments WHERE user_id = user.id)
) as comment_answers_count
FROM user
我想这甚至可以重写Eloquent方法从一个表读取并写入另一个表,因为这个特定的SQL视图是只读的,但在我的情况下只读访问就足够了,所以我&#39;我只是设置另一个模型UserWithComments
,最后可以像
$popularUsers = UserWithComments::where('comment_answer_count', '>=', 100)