我有3张桌子 -
users(id,name,dob)
books(id,title,author)
issuedbooks(id,book_id,student_id,issue_date)
用户和书籍之间的关系很多,导致第三张表发行。
我的模特是 -
class student extends DataMapper{
var $table="students";
var $has_many=array(
"books"=>array(
"class"=>"book",
"join_table"=>"issuedbooks",
"join_self_as"=>"student",
"join_other_as"=>"book",
"other_field"=>"students"
)
);
}
class book extends DataMapper{
var $table="books";
var $has_many=array(
"students"=>array(
"class"=>"student",
"join_table"=>"issuedbooks",
"join_self_as"=>"book",
"join_other_as"=>"student",
"other_field"=>"books"
)
);
}
此表发行书的条目如 -
id student_id book_id issue_date
1 2 1 2013-07-18
2 2 4 2013-07-16
3 1 5 2013-07-18
4 2 6 2013-07-18
现在我必须找出所有那些由id为2和issue_date 2013-7-17的学生选择的书。
我已经尝试过,但不会得到任何结果。
$student=new student();
$student->get_by_id('2');
$student->books->include_join_fields()->get();
foreach($student->books as $book):
$ book-> where_join_field($ student,'issue_date>',“2013-07-17”) - > get();
echo $book->title." ".$book->join_issue_date."<br />";
endforeach;
请帮帮我,我哪里错了?
答案 0 :(得分:-1)
这是我对这个问题的解决方案,我想这很简单。
此外,您不必在多对多表(已发行书)中创建ID列
issuedbooks
。book_id
和issuedbooks
。student_id
必须是primary_keys。
class SomeModel extends CI_Model
{
public function getBooksByStudentIdAndDate($students_id, $date)
{
$students_id = (int) $students_id;
$date = (date('Y-m-d', strtotime($date)) === $date) ? $date : false;
if( ! $students_id OR ! $date)
return array();
$this->db->where('issuedbooks.students_id', $students_id);
$this->db->where('issuedbooks.issued_date', $date);
$this->db->select('
users.name,
books.title,
issuedbooks.issued_date as date
');
$this->db->join('users','issuedbooks.students_id=users.id');
$this->db->join('books','issuedbooks.book_id=books.id');
$this->db->order_by('issuedbooks.issued_date', 'asc');
return $this->db->from('issuedbooks')->get()->result_array();
}
}
答案 1 :(得分:-1)
我会这样做:
$student=new student();
$books = $student->where('id',2)
->where_related_book('issue_date','2013-07-17')
->get()
foreach($books as $book){
...
总的来说,我认为你的模型过于复杂。只要您遵守标准,就不需要在关系中指出连接表等