简体   繁体   English

如何从 Codeigniter 中的多个表中搜索数据?

[英]How to search data from multiple tables in Codeigniter?

Hope you all good.希望你们一切都好。

I am writing a query to get data from multiple tables with matched keyword, but always fail and server crashed.我正在编写一个查询以从具有匹配关键字的多个表中获取数据,但总是失败并且服务器崩溃。 Please check my code below and let me know where i am wrong.请检查我下面的代码,让我知道我错在哪里。

$this->db->select('c.name, c.email, c.comment, b.title, b.content')->from('blogs as b, blog_comments as c');
$this->db->group_start();
$this->db->or_like('c.name', $search);
$this->db->or_like('c.email', $search);
$this->db->or_like('c.comment', $search);
$this->db->or_like('b.title', $search);
$this->db->or_like('b.content', $search);
$this->db->group_end();
$this->db->limit(10);
$result = $this->db->get()->result_array();

echo $this->db->last_query();
echo '<pre>';
print_r($result);
echo '</pre>';

Any solution appreciated!任何解决方案表示赞赏!

I rewrite your code with using JOIN instead of multiple FROM.我使用 JOIN 而不是多个 FROM 重写您的代码。 Try it.试试看。 I hope to helped for you.我希望对你有所帮助。

$this->db->select('c.name, c.email, c.comment, b.title, b.content');
$this->db->from('blogs as b');
$this->db->join('blog_comments as c','b.blog_id = c.blog_id');
$this->db->group_start();
$this->db->like('c.name', $search);
$this->db->or_like('c.email', $search);
$this->db->or_like('c.comment', $search);
$this->db->or_like('b.title', $search);
$this->db->or_like('b.content', $search);
$this->db->group_end();
$this->db->limit(10);
$result = $this->db->get()->result_array();

echo $this->db->last_query();
echo '<pre>';
print_r($result);
echo '</pre>';

After lot of search from past few days finally found the solution for Codeigniter.经过几天的大量搜索,终于找到了 Codeigniter 的解决方案。

Now this function can search in your whole database without join.现在这个 function 可以在您的整个数据库中搜索而无需连接。

function grep_db($db_name, $search_values = array())
{
        $table_fields = array();
        $cumulative_results = array();
        $result = $this->db->query("
        SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
        FROM  `INFORMATION_SCHEMA`.`COLUMNS` 
        WHERE  `TABLE_SCHEMA` =  '{$db_name}'
        AND `DATA_TYPE` IN ('varchar', 'char', 'text')
        ")->result_array();

        foreach ($result  as $o) {
            $table_fields[$o['TABLE_NAME']][] = $o['COLUMN_NAME'];
        }
        foreach ($table_fields as $table_name => $fields) {
            $search_array = array();
            foreach ($fields as $field) {
                foreach ($search_values as $value) {
                    $search_array[] = " `{$field}` LIKE '%{$value}%' ";
                }
            }
            $search_string = implode(' OR ', $search_array);
            $query_string = "SELECT * FROM `{$table_name}` WHERE {$search_string}";
            $this->db->limit(10);
            $table_results = $this->db->query($query_string)->result_array();
            $cumulative_results = array_merge($cumulative_results, $table_results);
        }

        return $cumulative_results;
}

UPDATE更新

Search on specific table and columns of that table.搜索特定表和该表的列。

$search_tables = array(
    'blog_comments',
    'blog_comments' => array(
        'comment', 'email', 'name', 'blog_id'
    ),
    'blogs',
    'blogs' => array(
        'title', 'content', 'slug', 'blog_id'
    )
);

$result = $this->grep_db($this->db->database, [$search], $search_tables);
private function grep_db($db_name, $search_values = array(), $search_tables = array())
{
        $table_fields = array();
        $cumulative_results = array();

        $result = $this->db->query("
        SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
        FROM  `INFORMATION_SCHEMA`.`COLUMNS` 
        WHERE  `TABLE_SCHEMA` =  '{$db_name}'
        AND `DATA_TYPE` IN ('varchar', 'char', 'text')
        ")->result_array();

        foreach ($result  as $o) {
            if (in_array($o['TABLE_NAME'], $search_tables)) {
                $table_fields[$o['TABLE_NAME']][] = $o['COLUMN_NAME'];
            }
        }

        foreach ($table_fields as $table_name => $fields) {
            $search_array = array();
            foreach ($fields as $field) {
                if (in_array($field, $search_tables[$table_name])) {
                    foreach ($search_values as $value) {
                        $search_array[] = " `{$field}` LIKE '%{$value}%' ";
                    }
                }
            }

            $search_string = implode(' OR ', $search_array);
            $search_column = implode(', ', $search_tables[$table_name]);
            $query_string = "SELECT {$search_column} FROM `{$table_name}` WHERE {$search_string}";
            $table_results = $this->db->query($query_string)->result_array();
            foreach ($table_results as $key => $result) {
                if (isset($result['blog_id'])) {
                    $table_results[$key]['link'] = $this->generate_url($result['blog_id']);
                }
                $table_results[$key]['table_name'] = $table_name;
            }
            $cumulative_results = array_merge($cumulative_results, $table_results);
        }
        return $cumulative_results;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM