我在模型中创建一个函数来查找所有相关服务。
在ServiceCategory.php
class ServiceCategory extends Entity
{
public function relatedServices($id)
{
return $this->find('all', [
'conditions' => [
'where' => [
'id !=' => $id
],
'limit' => 5
]
]);
}
}
并致电ServiceCategoriesController.php
public function view($id = null)
{
$serviceCategory = $this->ServiceCategories->get($id, [
'contain' => ['Services']
]);
$relatedServices = $this->ServiceCategories->relatedServices($id);
$this->set('serviceCategory', $serviceCategory);
$this->set('relatedServices', $relatedServices);
$this->set('_serialize', ['serviceCategory']);
}
但它提供了Unknown method 'relatedServices'
我有什么问题吗?
答案 0 :(得分:5)
在问题中:
类ServiceCategory扩展实体
这是entity类
$ relatedServices = $ this-> ServiceCategories-> relatedServices($ id);
这是对table对象进行调用,表对象和实体不会相互继承,该方法对表类不可用。
直接解决方案是将代码移动到表类:
// src/Model/Table/ServiceCategoriesTable.php
namespace App\Model\Table;
class ServiceCategoriesTable extends Table
{
public function relatedServices($id)
{
return $this->find('all', [
'conditions' => [
'where' => [
'id !=' => $id
],
'limit' => 5
]
]);
}
虽然可以说是正确/更好的方法是实现一个查找器:
// src/Model/Table/ServiceCategoriesTable.php
namespace App\Model\Table;
use Cake\ORM\Query;
use \InvalidArgumentException;
class ServiceCategoriesTable extends Table
{
public function findRelatedServices(Query $query, array $options)
{
if (!isset($options['id'])) {
$message = sprintf('No id in options: %s', json_encode($options));
throw new InvalidArgumentException($message);
}
$query->where(['id !=' => $options['id']);
return $query;
}
将以与其他find calls完全相同的方式调用:
$relatedServices = $this->ServiceCategories->find(
'relatedServices',
['id' => $id]
);