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
的第二个解决方案有一个优点 = 它节省了数据库查询。
我正在努力学习一些关于 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
的第二个解决方案有一个优点 = 它节省了数据库查询。