【问题标题】:CakePHP search function with jsonCakePHP 带有 json 的搜索功能
【发布时间】:2023-03-11 02:53:01
【问题描述】:

我刚刚开始使用 CakePHP,遇到了一些问题。 我有这个搜索功能,用于在 mysql 数据库(艺术家和 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 回显。只要查询找到名字就可以正常工作,但如果查询只找到姓氏则不行。奇怪的是,我只有在找到名字时才从我的 GET 请求中收到 application/json,否则我会在 text/html 中得到正确的结果。这是为什么呢?

【问题讨论】:

标签: php mysql cakephp


【解决方案1】:

您正在使用单独的表来存储姓氏,并且基本上通过将 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 Artist 关系转换为“LEFT”连接,这样如果没有找到“姓氏”,也将返回结果。

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

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

但是,我尝试尽可能地接近您的原始功能。

为什么您要为艺术家的姓氏使用单独的模型?我想不出有什么理由让事情变得如此复杂?

【讨论】:

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