【问题标题】:laravel ORM multiple valueslaravel ORM 多个值
【发布时间】:2015-03-04 17:26:16
【问题描述】:

我正在努力学习一些有关 laravel 的知识,但我有点不确定以下的正确路线是什么:

我想要一个用户仪表板,显示用户的总消息,除以已读/未读消息,以及显示即将执行的任务和过期任务的任务列表。

现在我正在考虑这样做的方式是在控制器中设置这些值:

// the user index controller function
public function getIndex()
{
    $read = Message::where('user_id', '=', Auth::user()->id)
            ->where('read', '=', 1);
    $unread = Message::where('user_id', '=', Auth::user()->id)
            ->where('read', '=', 0);
    // etc

    return View::make('user.index');
}

这似乎真的有点毫无意义和重复。有没有办法将messages 的总结果返回到视图,然后在那里通过 read / unread 将它们拆分,或者在模型中创建将直接返回这些数字的函数是否更聪明?或者也许我完全错过了正确的方式?

谢谢

【问题讨论】:

    标签: php laravel laravel-4 orm


    【解决方案1】:

    最方便的方法是创建简单的关系:

    // User
    public function messages()
    {
      return $this->hasMany('Message');
    }
    
    public function unreadMessages()
    {
      return $this->messages()->where('read', 0);
    }
    
    // or using filter method and accessor
    public function getUnreadMessagesAttribute()
    {
      return $this->messages->filter(function ($message) {
         return $message->read == 0;
      });
    }
    
    public function readMessages()
    {
      return $this->messages()->where('read', 1);
    }
    
    public function tasks()
    {
      return $this->hasMany('Task');
    }
    
    public function todoTasks()
    {
      // for example:
      return $this->tasks()->where('deadline', '>', Carbon::now())->where('done', 0);
    }
    
    public function overdueTasks()
    {
      return $this->tasks()->where('deadline', '<', Carbon::now())->where('done', 0);
    }
    

    那么你可以简单地使用这个:

    Auth::user()->overdueTasks;
    Auth::user()->unreadMessages;
    

    在集合上使用filter 的第二个解决方案有一个优点 = 它可以保存数据库查询。

    【讨论】:

      【解决方案2】:
      $messages = Message::where('user_id', Auth::id())->get()->groupBy('read');
      
      // ['0' => [...models...], '1' => [...models...]]
      
      return View::make('user.index', [
          'messages' => [
              'unread' => array_get($messages, '0', []),
              'read' => array_get($messages, '1', []),
          ],
      ]);
      

      【讨论】:

      • @user3055285 - 使用 4.2 - groupBy 在 4.2 中添加
      【解决方案3】:
      $messages = Message::where('user_id', '=', Auth::user()->id)
                      ->get(array(
                              '*',
                              DB::raw('IF(read = '1', 1, 0) AS is_read'),
                          ));
      

      所有已读消息的键 is_read 设置为 1,未读消息的键设置为 0

      【讨论】:

        猜你喜欢
        • 2018-12-29
        • 1970-01-01
        • 1970-01-01
        • 2016-03-16
        • 2016-07-15
        • 2015-04-16
        • 2015-05-18
        • 2015-02-04
        • 2013-06-19
        相关资源
        最近更新 更多