【问题标题】:Containable Behaviour in CakephpCakephp 中的可包含行为
【发布时间】:2013-06-19 03:58:58
【问题描述】:

据我所知,很长一段时间以来,我一直在使用递归来控制我的模型关系。如果我在我的模型之间建立任何关系,它肯定会与分页自动连接。为了控制我需要使用递归。默认情况下,它的值为1 并控制;我必须将其用作-10。是的,我读到了 Containable 行为,它如何自动控制从其他模型获取结果,尽管建立了关系。

我的经历和写作一样

public $actsAs = array('Containable'); 

在我的控制器中我写了

$this->Album->Behaviors->load('Containable', array('autoFields' => false, 'recursive'=>false));

但我的默认分页也会调用来自其他模型的数据以及使用其他模型获取查询。

$this->paginate['Album'] = array('conditions' => $condition, 'limit' => '50', 'order' => array('Album.id' => 'DESC'));
$this->set('albums', $this->paginate('Album'));

根据我的预期数据,我的默认分页代码仅来自 Album Model,而要从其他模型中获取,我必须在 Pagination 中描述它,但是当我在调试工具包中检查它时,它会显示这一点。

以及从所有变量中获取数据。

我该怎么办??我哪里错了??

【问题讨论】:

  • 你能重新写下你的问题吗?我无法理解您的问题以及您期望的结果。
  • 我的意思是说如果我在我的模型中写public $actsAs = array('Containable'); ,那么不应该获取关联的模型数据。如果我想要来自关联模型的数据,那么我应该在控制器中提及。但默认情况下,无论我写了public $actsAs = array('Containable'); ,它都会获取关联的模型数据
  • @Martin Bean 如果您有疑问,我期待您的回复。

标签: cakephp cakephp-2.0


【解决方案1】:

你不想要相关模型的数据,如果我错了,请纠正我。 为此,您需要将包含属性设置为 false。这只会带来 Album 模型的数据

$this->paginate['Album'] = array('conditions' => $condition,'contain' => false 'limit' => '50', 'order' => array('Album.id' => 'DESC'));
$this->set('albums', $this->paginate('Album'));

当您想在查询中附加多个模型时,包含将很有帮助,例如

$this->paginate['Album'] = array('conditions' => $condition,'contain' => array('model1','model2'), 'limit' => '50', 'order' => array('Album.id' => 'DESC'));

我希望这对你有用。谢谢

【讨论】:

  • public $actsAs = array('Containable'); 但是当我使用它时,不应获取相关的模型数据。因为使用'contain' => false限制关联模型数据也可以通过'recursive' => 0实现。那么两者有什么区别呢。
  • 两者实际上是相同的。 $actsAs = array('Containable') 表示该模型附加了可包含的行为
【解决方案2】:

即使您的模型设置为可包含,您仍然可以将recursive 设置为false 以防止获取相关数据。

示例模型:

<?php
class Article extends AppModel {

    public $actsAs = array('Containable');
    public $belongsTo = array('Category');
}

样品控制器:

<?php
class ArticlesController extends AppController {

    public function index() {
        $this->Article->recursive = 0;
        $this->set('articles', $this->paginate('Article'));
    }

    public function view($id) {
        $this->Article->recursive = 0;
        $this->set('article', $this->Article->findById($id));
    }
}

【讨论】:

  • 请重新阅读问题。如果recursive 可以实现同样的目标,那么Containable 需要什么。如果提到Containable,那么为什么默认它会获取关联的模型数据??
  • 好吧,我建议您阅读有关可包含行为的 CakePHP 书籍条目:book.cakephp.org/2.0/en/core-libraries/behaviors/…
猜你喜欢
  • 2015-04-03
  • 1970-01-01
  • 2011-11-06
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多