我搜索过SO和Google,但找不到我需要的东西。
我正在使用CodeIgniter 2构建一个简单的事件日历。As per the CodeIgniter documentation,这是基本的代码结构,它正在运行......
// $data[2] contains the data for day #2, etc.
$data[2] = '<a href="#">event title 1</a>';
$data[8] = '<a href="#">event title 2</a><br/><a href="#">event title 3</a>';
$data[13] = '<a href="#">event title</a>';
$data[24] = '<a href="#">event title</a>';
// {content} in template is where $data is inserted for each day
$prefs = array (
// my calendar options
'template' => '
{cal_cell_content}{day}<br/>{content}{/cal_cell_content}
{cal_cell_content_today}<div class="highlight">{day}<br/>{content}</div>{/cal_cell_content_today}'
);
$this->load->library('calendar', $prefs);
$year = ($year === FALSE ? date('Y') : $year);
$month = ($month === FALSE ? date('m') : $month);
echo $this->calendar->generate($year, $month, $data);
现在我是如何设置数据库表的......
每个事件都有一个title
字段,可以创建$slug
。 (~/events/view/title-slug
)
每个活动都有一个date
字段,数据格式为mm/dd/yyyy
现在,我正在考虑如何查询特定月/年的数据库,并提取数据以插入每个$data[]
变量。
好像我需要做以下事情:
在我的数据库表格中为month
,day
和year
创建新列。
在我的date
输入数据经过验证后,将其保存到date
列。
拆分我的date
输入数据,并将每个部分保存到month
,day
和year
列。
然后我只想查询我的数据库year
&amp; month
,然后循环浏览这些结果,为每个$data[]
构建我的day
数组。
这是我应该接近这个问题的正确方法吗?拥有date
列以及month
,day
和year
列似乎非常多余。只能使用date
(mm/dd/yyyy
)列来完成吗?太简单?太复杂了?我想避免给用户多个字段来输入日期,最后我会有一个jQuery日期选择器来帮助确保正确的数据格式。
我知道这可能看起来像一个简单的问题,但我无法在线找到简单的代码示例。我发现的大多数都是过时的(CI而不是CI2),对于我正在做的事情来说过于复杂,或者使用包含已经包含日期(~/events/view/yyyy/mm/dd
)的URI段的日常内容项。
修改:
这就是我的模型目前的设置方式:
return $this->db->get_where('events', array('yyyy' => $year, 'mm' => $month))->result_array();
答案 0 :(得分:1)
您可以按原样保留所有内容,只需构建查询以将月份和年份作为单独的列返回:
SQL中的:
SELECT id,
title,
description,
MONTH(date_field) as event_month,
YEAR(date_field) as event_year
FROM my_table
... etc ...
并在Active Record(taken from here)中:
$this->db->select('id');
$this->db->select('title');
$this->db->select('description');
$this->db->select("MONTH(date_field) AS event_month");
$this->db->select("YEAR(date_field) AS event_year");
$query = $this->db->get('my_table');
$results = $query->result();
答案 1 :(得分:0)
首先,我将date
列更改为MySQL“日期”格式yyyy-mm-dd
,以便利用built-in MySQL date functions。
我的原始$查询如下,其中'yyyy'
和'mm'
是我的多余“年”和“月”列:
$this->db->get_where('events', array('yyyy' => $year, 'mm' => $month))->result_array();
我只是使用内置的MySQL日期函数将其更改为以下内容:
$this->db->get_where('events', array('YEAR(date)' => $year, 'MONTH(date)' => $month))->result_array();
这解决了这个问题。现在我不再需要维护“年”和“月”的额外列。
此外,我可以使用MySQL“alias”函数将date
列的“day”部分分配给名为dd
的虚拟列:
$this->db->select('DAY(date) AS dd');
但是,这会失败,因为它会超越CI的默认select('*')
。因此,您必须先select()
所有相关列,否则会出错:
$this->db->select('*');
$this->db->select('DAY(date) AS dd');
将所有内容放在模型中:
// select all relevant columns
$this->db->select('*');
/* use MySQL date functions to creates virtual column called 'dd' containing
"day" portion of the real 'date' column. */
$this->db->select('DAY(date) AS dd');
/* use MySQL date functions to match $year and $month to "year" and "month"
portions of real 'date' column. */
return $this->db->get_where('events', array('YEAR(date)' => $year, 'MONTH(date)' => $month))->result_array();