gpt4 book ai didi

mysql - Cakephp 容器行为中的多表搜索

转载 作者:行者123 更新时间:2023-11-29 10:39:15 25 4
gpt4 key购买 nike

你好,我想使用用户输入的关键字从多个表中获取结果。我遇到的问题是我不知道如何在通过 contain

的表上进行搜索

这是我的查询

public function getGigPostBasedOnSearch($keyword){
$this->Behaviors->attach('Containable');
return $this->find('all', array(

'contain' => array(
'User','UserInfo', 'GigPostAndCategory.Category','Location','GigPostAndCalender'

),
'conditions' => array(
'AND' => array(
'GigPost.active' => 1,
'OR' => array(

array('GigPost.title LIKE' => '%'.$keyword.'%'),
array('GigPost.description LIKE' => '%'.$keyword.'%'),
array('Location.location_string LIKE' => '%'.$keyword.'%'),


)
)
//'OrderGigPost.request' => 0
),
'order' => 'GigPost.gig_post_id DESC',

'recursive' => 0
));
}

这个查询工作正常。我也想在类别表中搜索关键字。我想做这样的事情

array('Category.cat_name LIKE' => '%'.$keyword.'%')

请帮助我如何在类别表中进行搜索

谢谢

模型 GigPost.php

<?php



class GigPost extends AppModel
{
public $useTable = 'gig_post';
public $primaryKey = 'gig_post_id';

public $hasAndBelongsToMany = array(
'Category' =>
array(
'className' => 'Category',
'joinTable' => 'gigpost_category',
'foreignKey' => 'gig_post_id',
'associationForeignKey' => 'cat_id',
'unique' => true,
)
);
public $hasOne = array(
'Location' => array(
'className' => 'Location',
'foreignKey' => 'gig_post_id',
'conditions' => array('GigPost.gig_post_id = Location.gig_post_id')
));


public $belongsTo = array(
'User' => array(
'className' => 'User',
'foreignKey' => 'user_id',
'fields' => array('User.user_id','User.email','User.active')

),
'UserInfo' => array(
'className' => 'UserInfo',
'foreignKey' => 'user_id',


)

);







public function getGigPostBasedOnSearch($keyword){
$this->Behaviors->attach('Containable');
return $this->find('all', array(

'contain' => array(
'User','UserInfo', 'GigPostAndCategory.Category'=>array(
'conditions'=>array(

'OR' => array(

array('Category.cat_name' => '%'.$keyword.'%'),
),


)
),'Location','GigPostAndCalender'

),
'conditions' => array(
'AND' => array(
'GigPost.active' => 1,
'OR' => array(


array('GigPost.title LIKE' => '%'.$keyword.'%'),
array('GigPost.description LIKE' => '%'.$keyword.'%'),
array('Location.location_string LIKE' => '%'.$keyword.'%'),
// array('Category.cat_name LIKE' => '%'.$keyword.'%'),


)
)
//'OrderGigPost.request' => 0
),
'order' => 'GigPost.gig_post_id DESC',

'recursive' => 0
));
}




}

最佳答案

您的问题是,GigPostCategory 之间的关系是 HABTM,因此当您使用 contain Cake 时,必须执行单独的查询来检索相关类别,因为不存在一对一关联。为了解决这个问题,您需要手动执行连接而不是包含类别:-

$this->find('all', array(
'contain' => array(
'User', 'UserInfo', 'GigPostAndCategory.Category', 'Location', 'GigPostAndCalender'
),
'joins' => array(
array(
'table' => 'gigpost_category',
'alias' => 'GigPostCategory',
'type' => 'INNER',
'conditions' => 'GigPost.id = GigPostCategory.gig_post_id'
),
array(
'table' => 'categories',
'alias' => 'Category',
'type' => 'INNER',
'conditions' => 'Category.id = GigPostCategory.cat_id'
)
),
'conditions' => array(
'AND' => array(
'GigPost.active' => 1,
'OR' => array(
array('GigPost.title LIKE' => '%'.$keyword.'%'),
array('GigPost.description LIKE' => '%'.$keyword.'%'),
array('Location.location_string LIKE' => '%'.$keyword.'%'),
array('Category.cat_name LIKE' => '%'.$keyword.'%'),
)
)
),
'order' => 'GigPost.gig_post_id DESC',
'group' => 'GigPost.id',
'recursive' => 0
));

这可确保类别将包含在主查询返回的数据中。

您可能需要稍微修改 joins 数组,因为您似乎没有为表使用 Cake 命名约定,所以我不确定您命名的内容。但是,这应该会让您走上正轨。

关于mysql - Cakephp 容器行为中的多表搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45834269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com