0

我正在使用 Jamie Rumbelow 的 MY_Model 并且需要添加一个函数,以便它包含一些额外的数据。

我看到了这篇文章,它帮助我找到了完成此操作所需的内容,但我遇到了 SQL 错误。关于什么是错的任何想法?

错误号:1064

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 'FROM ( titles) JOIN usersON附近使用的正确语法titlescreator_id= usersuser_id' 在第 2 行

SELECT CONCAT_WS(' ', `users`.`first_name`, `users`.`last_name)` AS creator FROM (`titles`) JOIN `users` ON `titles`.`creator_id` = `users`.`user_id`

public function with_creator()
{
    $this->db->join('users', 'titles.creator_id = users.user_id');
    $this->db->select("CONCAT_WS(' ', users.first_name, users.last_name) AS creator");

    return $this;
}

当我使用 Jamie 的 MY_Model 时,我使用以下代码。

// In controller
$pages = $this->pages->with_creator()->get_all();

// In Model
class Pages_m extends MY_Model 
{
public $_table = 'pages';
public $primary_key = 'page_id';

public function with_creator()
    {
        $this->db->join('users', 'pages.creator_id = users.user_id');
        $this->db->select("CONCAT_WS(' ', users.first_name, users.last_name) AS creator", FALSE);

        return $this;
    }
}

它现在只包括创建索引,不包括来自页面本身的任何数据。

4

2 回答 2

3

这是 CodeIgniter 的活动记录/查询构建器本身的一个错误。它与 Jamie 的基本模型无关。发生该错误是因为字符串使用, 以逗号作为分隔符SELECT进行分解。explode()由于函数中有逗号,因此在某些情况下会产生一些错误。

你有两个选择:

  1. 手动编写查询。您不必一直使用查询构建器,尤其是当您只针对单一类型的数据库时(查询构建器的一大特点是让您的应用程序与 DB 无关)。

  2. 告诉查询生成器不要逃避该特定SELECT调用。您可以通过两种方式做到这一点:

数组语法:

$this->db->select(array("CONCAT_WS(' ', users.first_name, users.last_name) AS creator"));

转义参数:

$this->db->select("CONCAT_WS(' ', users.first_name, users.last_name) AS creator", FALSE);

这个错误应该在 CI 3.0 稳定后得到纠正。它还没有在开发版中修复,但问题是已知的,它只需要解决和合并。如果你有任何反馈,你可以在这里贡献

选择问题:查询只返回你的creatorconcat 结果,因为这就是你所要求的。该get_all()方法不会自动选择所有内容,这只是查询生成器的标准默认设置。一旦你指定了一个select()调用,它就会使用它而不是默认的*.

您应该修改select()(或添加另一个)以确保正确调用其他列。

于 2013-04-18T20:40:35.577 回答
3

您的查询在错误的地方有一个反引号。像这样修复:

SELECT CONCAT_WS(' ', `users`.`first_name`, `users`.`last_name`) AS creator 
FROM (`titles`) JOIN `users` ON `titles`.`creator_id` = `users`.`user_id`
于 2013-04-18T20:03:55.660 回答