cakephp中多个模型的单分页
我的要求是搜索两个不同的表格:兽医和诊所。它们之间可能有联系,即结果应该是诊所名称中有“a”,兽医名称中有“a”。兽医可能与诊所有关,也可能与诊所无关。目前我正在做以下工作。是否有任何方法可以避免运行2个查询,这也可以帮助我使用cakephp分页助手cakephp中多个模型的单分页,php,mysql,cakephp,view,pagination,Php,Mysql,Cakephp,View,Pagination,我的要求是搜索两个不同的表格:兽医和诊所。它们之间可能有联系,即结果应该是诊所名称中有“a”,兽医名称中有“a”。兽医可能与诊所有关,也可能与诊所无关。目前我正在做以下工作。是否有任何方法可以避免运行2个查询,这也可以帮助我使用cakephp分页助手 $this->paginate = array( 'Vet' => array( 'conditions' => $conditions, 'fields' =>
$this->paginate = array(
'Vet' => array(
'conditions' => $conditions,
'fields' => array('Vet.id', 'Vet.name', 'Vet.professionnal_address', 'phone_number', 'Vet.email', 'Vet.type', 'Vet.latitude', 'Vet.longitude','Vet.city','Vet.clinic_id','Vet.zipcode'),
'joins' => array(
array(
'table' => 'vet_appointment_types',
'alias' => 'VetAppointmentType',
'type' => 'LEFT',
'conditions' => array(
'Vet.id = VetAppointmentType.vet_id',
)
)
),
'limit' => $limit,
'group' => array(
'Vet.id'
),
'order' => array(
'Vet.name' => 'ASC'
)
),
'Clinic' => array(
'conditions' => $conditions1,
'fields' => array('Clinic.*'),
'limit' => $limit,
'order' => array(
'Clinic.name' => 'ASC'
)
)
);
$results = $this->paginate('Vet');
$results2 = $this->paginate('Clinic');
我尝试在非数据库模型中扩展默认分页组件并使用union,但数据库结构有点复杂,因此无法使用union。另外,我认为实现一个临时的基于表的模型是一种选择,但由于它将用于搜索,所以如何具体实现它,我无法思考。任何帮助都将是+1'd;) 根据建议,我使用数据库视图完成了它。下面是代码。如有任何改进建议,我们将不胜感激
// \app\Model\Search.php
App::uses('ConnectionManager', 'Model');
App::uses('AppModel', 'Model');
App::uses('CakeLog', 'Log');
class Search extends AppModel {
public function __construct() {
parent::__construct();
$connection = ConnectionManager::getDataSource('default');
$return = $connection->execute("CREATE OR REPLACE VIEW `search` AS
SELECT Vet.id, (CONCAT( `Vet`.`fname` , ' ', `Vet`.`lname` )) AS name, 'vet' AS TYPE , Vet.latitude, Vet.longitude, Vet.zipcode, Vet.speciality FROM `db`.`vets` AS `Vet`
UNION
SELECT Clinic.id, Clinic.name, 'clinic' AS TYPE , Clinic.lat, Clinic.long, Clinic.zipcode, Clinic.address FROM `db`.`clinics` AS `Clinic`");
$return = ($return == true)?'Search View created successfully on '.date('Y-m-d H:i:s'):$return;
CakeLog::write('search', $return);
}
public $useTable = 'search';// This model does not use a database table
public $primaryKey = 'id'; // Define primary key
public $useDbConfig = 'default'; // Define db
}
这就是模型。每次用户搜索任何内容时,当模型加载到控制器中时,都会创建/替换视图,以便获取更新的值。它可以用作cakephp中的任何其他模型。它还支持virtualFields。要为数据库视图生成查询,还可以使用查询生成器,我使用的方法如下
$joins = array(
array(
'table' => 'vet_appointment_types',
'alias' => 'VetAppointmentType',
'type' => 'LEFT',
'conditions' => array(
'Vet.id = VetAppointmentType.vet_id',
)
)
);
$dbo = $this->Vet->getDataSource();
$subQuery = $dbo->buildStatement(
array(
'fields' => array('Vet.id', 'Vet.name'),
'table' => $dbo->fullTableName($this->Vet),
'alias' => 'Vet',
'limit' => $limit,
'group' => array(
'Vet.id'
),
'order' => array(
'Vet.name' => 'ASC'
),
'offset' => null,
'joins' => $joins,
'conditions' => $conditions
),
$this->Vet
);
$query = $subQuery;
$query .= ' UNION ';
$dbo = $this->Clinic->getDataSource();
$subQuery = $dbo->buildStatement(
array(
'fields' => array('Clinic.id', 'Clinic.name'),
'table' => $dbo->fullTableName($this->Clinic),
'alias' => 'Clinic',
'limit' => $limit,
'conditions' => $conditions1,
'limit' => $limit,
'order' => array(
'Clinic.name' => 'ASC'
),
'offset' => null
),
$this->Clinic
);
$query .= $subQuery;
print_r($query);
根据建议,我使用数据库视图完成了它。下面是代码。如有任何改进建议,我们将不胜感激
// \app\Model\Search.php
App::uses('ConnectionManager', 'Model');
App::uses('AppModel', 'Model');
App::uses('CakeLog', 'Log');
class Search extends AppModel {
public function __construct() {
parent::__construct();
$connection = ConnectionManager::getDataSource('default');
$return = $connection->execute("CREATE OR REPLACE VIEW `search` AS
SELECT Vet.id, (CONCAT( `Vet`.`fname` , ' ', `Vet`.`lname` )) AS name, 'vet' AS TYPE , Vet.latitude, Vet.longitude, Vet.zipcode, Vet.speciality FROM `db`.`vets` AS `Vet`
UNION
SELECT Clinic.id, Clinic.name, 'clinic' AS TYPE , Clinic.lat, Clinic.long, Clinic.zipcode, Clinic.address FROM `db`.`clinics` AS `Clinic`");
$return = ($return == true)?'Search View created successfully on '.date('Y-m-d H:i:s'):$return;
CakeLog::write('search', $return);
}
public $useTable = 'search';// This model does not use a database table
public $primaryKey = 'id'; // Define primary key
public $useDbConfig = 'default'; // Define db
}
这就是模型。每次用户搜索任何内容时,当模型加载到控制器中时,都会创建/替换视图,以便获取更新的值。它可以用作cakephp中的任何其他模型。它还支持virtualFields。要为数据库视图生成查询,还可以使用查询生成器,我使用的方法如下
$joins = array(
array(
'table' => 'vet_appointment_types',
'alias' => 'VetAppointmentType',
'type' => 'LEFT',
'conditions' => array(
'Vet.id = VetAppointmentType.vet_id',
)
)
);
$dbo = $this->Vet->getDataSource();
$subQuery = $dbo->buildStatement(
array(
'fields' => array('Vet.id', 'Vet.name'),
'table' => $dbo->fullTableName($this->Vet),
'alias' => 'Vet',
'limit' => $limit,
'group' => array(
'Vet.id'
),
'order' => array(
'Vet.name' => 'ASC'
),
'offset' => null,
'joins' => $joins,
'conditions' => $conditions
),
$this->Vet
);
$query = $subQuery;
$query .= ' UNION ';
$dbo = $this->Clinic->getDataSource();
$subQuery = $dbo->buildStatement(
array(
'fields' => array('Clinic.id', 'Clinic.name'),
'table' => $dbo->fullTableName($this->Clinic),
'alias' => 'Clinic',
'limit' => $limit,
'conditions' => $conditions1,
'limit' => $limit,
'order' => array(
'Clinic.name' => 'ASC'
),
'offset' => null
),
$this->Clinic
);
$query .= $subQuery;
print_r($query);
如果不能使用union或视图,则很难对两个表中的非关联数据进行分页。为此,我将使用弹性搜索实现一个搜索索引。如果我使用临时表来存储表和搜索中的数据,这会是一个乏味的方法吗?它会,并且当任何数据更改时,您都必须更改临时表。也许你应该查看数据库视图?谢谢。我是使用数据库视图来完成的。如果不能使用union或视图,则很难对两个表中的非关联数据进行分页。为此,我将使用弹性搜索实现一个搜索索引。如果我使用临时表来存储表和搜索中的数据,这会是一个乏味的方法吗?它会,并且当任何数据更改时,您都必须更改临时表。也许你应该查看数据库视图?谢谢。我是用数据库视图做的。