【问题标题】:Why is my find clause not working?为什么我的 find 子句不起作用?
【发布时间】:2012-08-16 16:34:17
【问题描述】:

我有三个模型:Company、Office、CompanyPersonTask。 Company 模型有很多 Office 和很多 CompanyPersonTask。

那么,为什么是这个代码:

public function getCompaniesByRegion($region){
    $options['conditions'] = array("UPPER(Office.region) LIKE UPPER('".$region."%')");
    return $this->find('all', $options);   
}

导致以下错误?

“‘where 子句’中的未知列‘Office.region’”

region出现在offices 表中。

【问题讨论】:

  • 会不会像您在上一句中写的那样,该表实际上称为offices
  • 你需要加入office吗?
  • 该表称为offices,以复数形式,与任何其他db 表一样... 与名称约定相同。

标签: mysql cakephp cakephp-2.1


【解决方案1】:

好像你已经在CompanyOffice and CompanyPersonTask 之间指定了正确的关联。即Company hasMany OfficeCompany hasMany CompanyPersonTask。 然后你可以把它写成: 在您的公司模型中写下: public $actAs = array('Containable');

你的方法应该是:

class AppController extends Controller
{
     public $uses = array('Company', 'Office', 'CompanyPersonTask');

     protected function _getCompaniesByRegion($region){
         return $this->Company->find('all', array('contain' => 
                    array('Office' => array('conditions' => array("UPPER(Office.region) LIKE " => "UPPER('".$region."%')")))
                                                 )
                                    );
     }        
}

您可以使用$this->_getCompaniesByRegion($region_val); 将此方法调用到任何控制器中

【讨论】:

  • 你打算把那个方法放在哪里?我把它放在公司模型中。这样两种解决方案都不起作用,第一个得到一个非对象调用,第二个给了我同样的错误。我已经解决了使用从链中删除公司的第一个解决方案:return $this->Office->find('all', $options);
  • 一个相关的问题是:通过Office模型调用find,我无法访问CompanyPersonTask模型,因为它与公司有关,而不是办公室。
  • 你能更干净点吗?我应该在 Company 模型中拥有什么以及在 AppController 中拥有什么(以及为什么在 appController 中?)?
  • 没什么变化,唯一的结果模型是 Office、Company 和 OfficePersonTask(一种与 Office 相关的 CompanyPersonTask),但我仍然需要 CompanyPersonTask。
猜你喜欢
  • 2015-04-29
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多