2013-03-29 28 views
1

我刚刚开始使用CakePHP并遇到了一些问题。 我有在MySQL数据库中搜索两个表看起来像这样的这种搜索功能(艺术家和ArtistSurname):CakePHP与json的搜索功能

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,当找到firstname时,我会在text/html中得到正确的结果。为什么是这样?

+1

对于json部分你想阅读这个http://book.cakephp.org/2.0/en/views/json-and-xml-views.html – burzum

回答

2

您正在使用单独的表来存储姓,并且通过指定Artist.id = ArtistSurname.artist_id作为您的条件的一部分(两次)来基本构建INNER JOIN

此外,您正在以错误的方式定义条件;你应该为每个条件/字段使用'数组'符号,这样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

不过,我试过尽可能地保持原有的功能。

为什么您是否使用单独的模型作为艺术家的姓?我能想到没有理由让这个如此复杂?

+0

非常感谢你这个答案!像魅力一样工作!这是一个旧数据库,我正在建立一个新的网站,并且姓氏表只是许多奇怪的解决方案之一。我打算重建整个分贝,但我不允许客户改变任何不幸的事情。 “为什么在它工作时改变它?”他说..必须与我得到的东西一起工作我猜.. – bangerang

+0

当我得到代表时将投票! – bangerang

+0

那么,告诉客户,在这种情况下,有一个设计缺陷需要修复。在目前的形式下,艺术家可以拥有多个姓氏。由于加入,相同的艺术家可能会与另一个姓氏多次显示? – thaJeztah