使用 or_like codeigniter 时 join 未给出所需结果

问题描述 投票:0回答:1
$skills = explode(',', 'good listener,topper,leader');
$teacherID = 7;

function search_follower($teacherID, $skills, $limit, $start) {
    $this->db->limit($limit, $start);
    $this->db->select('student_skills.user_id');
    $this->db->from('student_skills');
    $this->db->join('followers', 'followers.student_id = student_skills.user_id', 'FULL JOIN');

    foreach ($skills as $skill) {
        $this->db->like('student_skills.name', $skill);
        $this->db->or_like('student_skills.name', $skill);
    }
    $this->db->where('followers.teacher_id', $teacherID);
    $query = $this->db->get();
    if ($query->num_rows() > 0) {
        foreach ($query->result() as $row) {
            $data[] = $row;
        }
        return $data;
    }
    return false;
}

学生技能表:

id
name
user_id

1
topper
5

2
leader
5

3
good listener
6

4
toper
6

关注表:

id
teacher_id
student_id

1
7
5

1
7
6

1
7
8

我编写了上面的模型函数来从student_skills表中获取跟随特定老师(

$teacherID
)并具有指定技能(
$skills
)的学生的学生ID..

当我使用多种技能(例如:好听众、礼帽等)或单一技能(例如:礼帽)运行上述函数时,它运行时不会显示任何错误。.但它为我提供了所有具有指定技能的学生,我会喜欢只有跟随特定老师的学生..并且具有指定的技能..

但是当我评论

or_like
声明时,它给了我所需的结果,但多种技能不起作用。.
ex: topper
工作和
ex:topper,topper
工作但
ex: topper,leader
不工作

我花了两天时间努力解决这个问题..但尚未找到任何解决方案....

任何建议或帮助都会有很大帮助..提前致谢。

php mysql codeigniter activerecord join
1个回答
0
投票

您的

LIKE
条件在调用
AND
时由
like()
加入,在调用
OR
时由
or_like()
加入;这可能是您的编码尝试中基于逻辑的问题。 检查
$this->db->last_query()
会更加清晰——然后您可以在 RDBMS 中执行构建的查询,看看它是否产生所需的结果。

要构建由

OR
分隔的一组括号隔离的 LIKE 条件,请使用
group_start()
,然后迭代调用
or_like()
(使用 foreach 或
array_walk()
),然后使用
group_end()
关闭该组。

我不建议有条件退货

false
。 因为此方法的目的是返回关注者 ID,所以应一致返回平面数组。
array_column()
可以在二维结果数组上调用来隔离所需的 ids 列。

public function getTeacherFollowersWithSkillsLike(
    int $teacherID,
    array $skills = [],
    ?int $limit = null,
    ?int $start = null
): array {
    // dynamically build the OR LIKE conditions as a single logical group
    $query = $this->db->group_start();
    array_walk(
        $skills,
        fn($term) => $this->db->or_like('student_skills.name', $term)
    );
    $this->db->group_end();

    // build the remainder of the query, execute, and return the isolated column values
    return array_column(
        $this->db
            ->select('student_skills.user_id')
            ->join('followers', 'followers.student_id = student_skills.user_id')
            ->get_where(
                'student_skills',
                ['followers.teacher_id' => $teacherID],
                $limit,
                $start
            ),
        'user_id'
    );
}

如果您希望返回具有所有合格技能值的行,那么您不需要分组方法调用;只需进行迭代

like()
调用即可:

// dynamically build the AND LIKE conditions
array_walk(
    $skills,
    fn($term) => $this->db->like('student_skills.name', $term)
);
© www.soinside.com 2019 - 2024. All rights reserved.