2

我搜索了 SO 和 Google,但找不到我需要的东西。

我正在使用 CodeIgniter 2 构建一个简单的事件日历。 根据 CodeIgniter 文档,这是基本的代码结构,它正在工作......

// $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)

  • 每个 Event 都有一个date字段,数据格式为mm/dd/yyyy

现在,我正在考虑如何查询特定月份/年份的数据库并提取数据以插入每个$data[]变量。

看来我需要执行以下操作:

  • month在我的数据库表中为、dayyear.创建新列

  • 在验证后获取我的date输入数据,并将其保存到date列中。

  • 拆分我的date输入数据,并将每个部分保存到monthdayyear列中。

然后我会简单地在我的数据库中查询year& month,然后遍历这些结果来$data[]为每个day.

这是我应该解决这个问题的正确方法吗?date拥有一列以及monthday和列似乎非常多余year。可以只使用date( mm/dd/yyyy) 列吗?太简单?太复杂了?我想避免为用户提供多个字段来输入日期,最终我将拥有一个 jQuery 日期选择器来帮助确保正确的数据格式。

我知道这似乎是一个简单的问题,但我未能在网上找到简单的代码示例。我发现的大多数内容都已过时(CI 而不是 CI2),对于我正在做的事情来说太复杂了,或者使用的日常内容项目的 URI 段已经包含日期(~/events/view/yyyy/mm/dd)。


编辑

这就是我的模型目前的设置方式:

return $this->db->get_where('events', array('yyyy' => $year, 'mm' => $month))->result_array();
4

2 回答 2

1

您可以保留所有内容,只需构建查询以将月份和年份作为单独的列返回:

在 SQL 中:

SELECT id, 
       title, 
       description, 
       MONTH(date_field) as event_month, 
       YEAR(date_field) as event_year 
FROM my_table
... etc ...

在 Active Record 中(取自此处):

$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();
于 2013-03-07T22:07:30.637 回答
0

首先,我将date列更改为 MySQL“日期”格式,yyyy-mm-dd以便利用内置的 MySQL 日期函数

我原来的 $query 如下,其中'yyyy'and'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“别名”函数date调用的虚拟列: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();
于 2013-03-17T00:32:06.900 回答