带有json的CakePHP搜索函数

带有json的CakePHP搜索函数,php,mysql,cakephp,Php,Mysql,Cakephp,我刚刚开始使用CakePHP,遇到了一些问题。 我有这个搜索功能,用于搜索mysql数据库中的两个表(艺术家和艺术家姓氏),如下所示: class ArtistsController extends AppController { public function search ($search) { if ($search){ $artists = $this->Artist->find('all', array('conditions' => array("s

我刚刚开始使用CakePHP,遇到了一些问题。 我有这个搜索功能,用于搜索mysql数据库中的两个表(艺术家和艺术家姓氏),如下所示:

class ArtistsController extends AppController {
public function search ($search) {
    if ($search){
    $artists = $this->Artist->find('all', array('conditions' => array("surname like '%$search%' AND Artist.id = ArtistSurname.artist_id OR firstname like '%$search%' AND Artist.id = ArtistSurname.artist_id"), 'limit' => 400, 'fields' => array('Artist.firstname', 'ArtistSurname.surname', 'Artist.dbirth', 'Artist.id')));
    if (!$artists){
        throw new NotFoundException(__('No search result.'));
    }
    $result = array();
    foreach ($artists as $artist) {
    $fetchedArtist = array('value' => $artist['ArtistSurname']['surname'] . " " . $artist['Artist']['firstname'], 'year' => $artist['Artist']['dbirth'], 'id' => $artist['Artist']['id']);
    array_push($result, $fetchedArtist);
    }
    header("Content-Type: application/json");
    echo json_encode($result);
    $this->autoRender = false;
    }
}
查询之后,我将结果放入一个新的可读数组中,用于自动完成(typeahead.js)和
将其作为json进行回应。只要查询找到名字,这种方法就可以了,但如果查询只找到姓氏,这种方法就不行。奇怪的是,当找到名字时,我只从GET请求接收application/json,否则我将得到正确的text/html结果。这是为什么?

您正在使用一个单独的表来存储姓氏,并且基本上通过指定
Artist.id=artistsnamname.Artist\u id
作为您的条件的一部分(两次)来构造一个
内部联接

同时,你用错误的方式定义了条件;您应该为每个条件/字段使用“array”符号,以便CakePHP能够正确地为您转义值

$artists = $this->Artist->find('all', array(
    'conditions' => array(
         'OR' => array(   
             'ArtistSurname.surname LIKE' => '%' . $search . '%',
             'Artist.firstname LIKE' =>  '%' . $search . '%',
         )
    ),
    joins => array(
        array(
          'table' => 'artist_surnames',
          'alias' => 'ArtistSurname',
          'type' => 'LEFT',
          'conditions' => array(
              'Artist.id = ArtistSurname.artist_id',
          )
       ),
    ),
    'limit' => 400, 
    'fields' => array(
        'Artist.firstname', 
        'ArtistSurname.surname',
        'Artist.dbirth',
        'Artist.id'
     )
));
我将ArtistName-Artist关系转换为“LEFT”联接,这样,如果没有找到“姓氏”,结果也将返回

通常,您不必在查询中手动指定这些关系,而是在模型关系中指定它们(Artist姓氏->归属->艺术家):

然而,我试图尽可能接近您的原始功能


为什么您要为艺术家的姓氏使用单独的模式?我想不出有什么理由把这件事弄得这么复杂?

对于您想阅读的json部分,非常感谢您的回答!工作得很有魅力!这是一个旧数据库,我正在为它建立一个新网站,姓氏表只是许多奇怪的解决方案之一。我计划重建整个数据库,但不幸的是,客户不允许我更改任何内容。他说:“当它起作用时,为什么要改变它呢?”。。我想我必须使用我得到的东西。好吧,告诉客户,在这种情况下,有一个设计缺陷需要修复。在目前的形式中,艺术家可以有多个姓氏。由于加入,同一个艺术家可能会以另一个姓氏?LOL多次出现,最好通过打印将成品的源代码交付给客户。告诉他们你这么做是因为纸张是一种经过验证的技术,而你没有转换到“互联网”——为什么要改变?纸还能用!(抱歉,忍不住)我会告诉他,我实际上在node.js中编写了一个脚本,读取了Artister_姓氏表,并创建了一个名和姓氏都有的新表,但他仍然说不,一个固执的老人。。问题是,他已经用同样的解决方案工作了大约10年,他担心如果更换他的名片库,一切都会崩溃。更妙的是,莫尔斯是一种经过验证的加密技术!