laravel ORM 多值

laravel ORM multiple values

我正在努力学习一些关于 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');
}

这看起来真的有点无意义和重复。有没有办法 return 总 messages 结果到视图,然后通过已读/未读将它们分开,或者在模型中创建函数会更聪明 return 这些直接上号?或者也许我完全错过了正确的方法?

谢谢

$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', []),
    ],
]);
$messages = Message::where('user_id', '=', Auth::user()->id)
                ->get(array(
                        '*',
                        DB::raw('IF(read = '1', 1, 0) AS is_read'),
                    ));

All the read messages will have a key of is_read set to 1 and unread will have a key set to 0

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

// 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 的第二个解决方案有一个优点 = 它节省了数据库查询。