CodeIgniter 的 Active Record 将先前的查询与新查询混淆了

问题描述 投票:0回答:2

我尝试在模型中使用另一个模型的方法来访问数据,但它给了我错误,因为它与之前的 $this->db 参数混淆了:

$this->db->select('*');
$this->db->group_start();
    $this->db->like('title', $keyword);
    $this->db->or_like('keyword', $keyword);
$this->db->group_end();

$locations = $this->place_model->search_ids_by_name($location);

而Place_model的

search_ids_by_name()
是这样的:

public function search_ids_by_name($q) {
    $this->db->select('id');
    $this->db->like('name', $q);
    $qry = $this->db->get('places');
    $results =  $qry->result_array();
    $place_ids = array();
    foreach ($results as $result) {
        array_push($place_ids, $result['id']);
    }
    return $place_ids;
}

但是它给了我以下错误

错误号:1054,“where 子句”中的未知列“类别” 文件名:models/Place_model.php

在我的 place_model 函数中,似乎也使用了

like()
or_like()
方法。我怎样才能将它们分开?

php codeigniter activerecord query-builder
2个回答
0
投票

我找到了解决办法。我又建立了一个连接:

public function search_ids_by_name($q) {
        $places_db = $this->load->database('default', TRUE);
        $places_db->select('id');
        $places_db->like('name',$q);
        $qry = $places_db->get('places');
        $results =  $qry->result_array();
        $place_ids = array();
        foreach ($results as $result) {
          array_push($place_ids, $result['id']);
        }
        return $place_ids;
}

0
投票

这就是“Active Record”的工作原理——您可以开始构建查询,然后转到其他地方并继续构建查询。

在您的代码中,初始查询构建不会执行,因此在构建新查询之前不会清除它 - 这就是第一个查询的各个方面渗透到外部模型方法的查询中的原因。

要解决此问题,只需提前移动

$locations = $this->place_model->search_ids_by_name($location);
,然后您就可以从头开始构建其他查询。


您的

search_ids_by_name()
方法可以如下所示:

public function getIdsByPartialNameMatch(string $term): array
{
    return array_column(
        $this->db->like('name', $q)->get('places')->result_array(),
        'id'
    );
}

我没有足够的信息来建议正在构建的其他查询,但在 CodeIgniter 中,您不需要编写

$this->db->select('*');
——这是默认的 SELECT 子句。

© www.soinside.com 2019 - 2024. All rights reserved.