CakePHP 3:未知方法

时间:2016-06-26 08:34:35

标签: cakephp model cakephp-3.0

我在模型中创建一个函数来查找所有相关服务。

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'

我有什么问题吗?

1 个答案:

答案 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]
);