我有一个名为Student
的数据库表,其列为id
,name
,age
。
id
是主键,name
不为空,age
可以为空
我想在php中实现以下功能,Zend:
如果name
值不同,则只在数据库中添加重复的学生age
。
在函数/ action addStudentAction
中,我调用了Student模型的函数 - findStudent
来实现这个要求:
public function findStudent($name)
{
$result = null;
$select = $this->select(Zend_Db_Table::SELECT_WITH_FROM_PART)
->setIntegrityCheck(false)
->where('student.name = ?', $name);
//error_log($select->assemble());
$result = $this->getAdapter()->fetchRow($select);
return $result;
}
public function addStudentAction() {
$data = $_POST;
$studentModel = new Application_Model_Student;
$result = $studentModel->findStudent($data['name']);
if(!empty($result)) {
error_log("found student name in db, going to get age");
//Check for age
if( (!empty($result['age'] )) {
if( $result['age'] != $data['age']) {
error_log("going to add student as new record");
return $this->insert($data);
}
else {
error_log("not adding new student record ");
}
}
}
}
现在,可能有多个学生的记录具有相同的name
但age
个{{1}}。因此,在添加新学生时,我需要比较年龄所有记录(如果名称匹配)与传入的年龄值。
实施此要求的最佳方法是什么?非常感谢任何帮助。
由于
答案 0 :(得分:0)
最简单的方法是在名称上创建复合UNIQUE索引,然后在age字段中创建。 UNIQUE允许多个NULL值,因此这不是问题。根据您的数据库大小和使用情况,这可能不是最受欢迎的选项,在这种情况下,在INSERT之前简单地选择学生信息以检查他/她是否已经在那里将是最好的解决方案。
如果我需要详细说明,请告诉我。我很乐意给你一些例子。
答案 1 :(得分:0)
如何使用名称和年龄进行新的SELECT:
public function findStudentWithAge($name, $age =null)
{
$result = null;
$select = $this->select(Zend_Db_Table::SELECT_WITH_FROM_PART)
->setIntegrityCheck(false)
->where('student.name = ?', $name);
if($age) $select->where('student.age = ?', $age);
//error_log($select->assemble());
$result = $this->getAdapter()->fetchRow($select);
return $result;
}
现在在addStudentAction中:
public function addStudentAction() {
$data = $_POST;
$studentModel = new Application_Model_Student;
$result = $studentModel->findStudent($data['name'], $data['age']);
if(!empty($result)) {
error_log("found student with this age, cannot add the record");
} else {
$this->insert($data);
}
}