使用datamapper在多对多关系中的第三个表字段上的条件

时间:2013-07-19 16:18:40

标签: php codeigniter codeigniter-datamapper

我有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;

请帮帮我,我哪里错了?

2 个答案:

答案 0 :(得分:-1)

这是我对这个问题的解决方案,我想这很简单。
此外,您不必在多对多表(已发行书)中创建ID列 issuedbooksbook_idissuedbooksstudent_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){
    ...

总的来说,我认为你的模型过于复杂。只要您遵守标准,就不需要在关系中指出连接表等