CakePHP搜索功能与json

时间:2013-03-29 16:02:27

标签: php mysql cakephp

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

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回应。只要查询找到名字,这就可以正常工作,但如果查询只找到姓氏,则不行。奇怪的是,当我找到firstname时,我只从我的GET请求中接收application / json,否则我在text / html中得到了正确的结果。这是为什么?

1 个答案:

答案 0 :(得分:2)

您正在使用单独的表来存储姓氏,并通过指定INNER JOIN作为您的情况的一部分(两次)来基本构建Artist.id = ArtistSurname.artist_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'
     )
));

我转换了ArtistSurname< - >艺术家与“左”联接的关系,如果未找到“姓氏”,也会返回结果。

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

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#associations-linking-models-together

但是,我尽量保持尽可能接近原始功能。

为什么您是否为艺术家的姓氏使用单独的模型?我觉得没有理由让这么复杂吗?