【问题标题】:Laravel - Displaying items from Collection and their sum from the related tableLaravel - 显示集合中的项目及其相关表中的总和
【发布时间】:2015-10-20 00:02:15
【问题描述】:

我在思考这个问题时遇到了问题。

我有两张桌子:

Users
+---------+
| id name |
+---------+
| 1 John  |
| 2 Ann   |
| 3 Joe   |
+---------+

Products
+---------------------+
| id product users_id |
+---------------------+
| 1  Bread      1     |
| 2  Apple      1     |
| 3  Egg        2     |
| 4  Juice      3     |
| 5  Cheese     3     |
| 6  Carrot     3     |
+---------------------+

我想进行查询,以显示用户以及 products 表中引用他的文章数量。像这样:

+----------------------+
| name sum_of_products |
+----------------------+
| Ivan       2         |
| Ann        1         |
| Joe        3         |
+----------------------+

我有工作模式和关系。 我可以只为这样的一个用户进行查询

$sum = User::whereId(1)->products()->count();

但是如何在一个查询中选择所有用户并获取他们的所有计数?

【问题讨论】:

    标签: php mysql laravel collections laravel-5


    【解决方案1】:

    laraves 访问器功能怎么样?

    您的用户模型应如下所示:

    namespace App;
    
    class User extends Model
    {
    
        protected $appends = array('sum_of_products');
    
        public function getSumOfProductsAttribute() {
    
            return $this->products()->count();
        }
    }
    

    查看docu

    【讨论】:

      【解决方案2】:

      你可以得到你需要的东西:

      $users = User::leftJoin('products', 'users.id', '=', 'products.user_id')->select('user_id', 'user.name')->selectRaw('count(*) as cnt')->groupBy('products.user_id')->get();
      

      然后你可以像这样访问计数和用户:

      foreach($users as $user) {
        $username = $user->name;
        $productCount = $user->cnt;
        ...; //do whatever you need with that data
      }
      

      【讨论】:

      • 谢谢你,这工作,我完全忘记了加入。
      【解决方案3】:

      这是普通的SQL

      SELECT users.name, count( products.users_id ) as sum_of_products
      FROM products LEFT JOIN users ON users.id=products.users_id 
      GROUP BY products.users_id
      

      在 laravel 中尝试一下,看看效果如何:

      $products = Products::leftJoin('users', 'users.id', '=', 'products.users_id')
        ->select('users.name', 'count(products.users_id) as sum_of_products')
        ->groupBy('products.users_id')
        ->get();
      

      【讨论】:

        猜你喜欢
        • 2010-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-09
        • 2017-03-12
        相关资源
        最近更新 更多