我如何遍历CakePHP关系?

我试图遍历CakePHP模型上的关系。 这是数据库: 我的数据库

我可以访问产品模型上的产品属性(产品 - >属性),但无法访问广告模型上的产品属性(ad-> product->属性)。

这是我的代码:

//Product Model class Product extends AppModel { public $useTable = 'products'; public $displayField = 'name'; public $hasAndBelongsToMany = array( 'Attributes' => array( 'className' => 'Attribute', 'joinTable' => 'product_has_attributes', 'foreignKey' => 'products_id', 'associationForeignKey' => 'attributes_id', 'unique' => true, 'conditions' => '', 'fields' => '', 'order' => '', 'limit' => '', 'offset' => '', 'finderQuery' => '', 'with' => 'product_has_attributes' ) ); public $hasMany = array( 'Ads' => array( 'className' => 'Ad', 'foreignKey' => 'Products_id', 'conditions' => '', 'order' => '', 'limit' => '', 'dependent' => true ) ); //Ad Model class Ad extends AppModel { public $displayField = 'Name'; public $belongsTo = array( 'Product' => array( 'className' => 'Products', 'foreignKey' => 'products_id', 'conditions' => '', 'fields' => '', 'order' => '' ) ); //Attribute Model class Attribute extends AppModel { public $displayField = 'name'; public $hasAndBelongsToMany = array( 'Products' => array( 'className' => 'Product', 'joinTable' => 'product_has_attributes', 'foreignKey' => 'attributes_id', 'associationForeignKey' => 'products_id', 'unique' => true, 'conditions' => '', 'fields' => '', 'order' => '', 'limit' => '', 'offset' => '', 'finderQuery' => '', 'with' => 'product_has_attributes' ) );

// Products controller -> Action View class ProductsController extends AppController { public function view($id = null) { if (!$this->Product->exists($id)) { throw new NotFoundException(__('Invalid product')); } $options = array('conditions' => array('Product.' . $this->Product->primaryKey => $id)); $this->set('product', $this->Product->find('first', $options)); } }

// Ads controller -> Action View class AdsController extends AppController { public function view($id = null) { if (!$this->Ad->exists($id)) { throw new NotFoundException(__('Invalid ad')); } $options = array('conditions' => array('Ad.' . $this->Ad->primaryKey => $id)); $this->set('ad', $this->Ad->find('first', $options));

}

这是我在观点中所做的:


//产品视图:view.ctp的snipet
print_r($ product);
//打印产品和所有相关属性


//广告点击次数:snipet of view.ctp
print_r($ ad ['Product']);
//这将仅打印产品字段,但不打印与产品关联的属性

哪里不对? 如何从我的广告模型访问关系Ad-> product->属性?


也许问题可能是你没有使用CakePHP的约定。

从文档:

“新连接表的名称需要包含所涉及的两个模型的名称,按字母顺序排列,并用下划线(_)分隔。”

所以,你的连接表应该被命名为attributes_products

另外,检查你的外键。 它们应该是单数形式。

  • attributes_products.id
  • attributes_products.product_id
  • attributes_products.attribute_id
  • 希望解决这个问题。

    参考文献:

    http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasandbelongstomany-habtm

    http://book.cakephp.org/2.0/en/getting-started/cakephp-conventions.html#model-and-database-conventions


    我可以想到几个简单的方法来实现这一点。

    第一:

    class AdsController extends AppController {
        if (!$this->Ad->exists($id)) {
            throw new NotFoundException(__('Invalid ad'));
        }
        $options = array(
            'conditions' => array('Ad.' . $this->Ad->primaryKey => $id),
            'recursive' => 1, // or more
        );
        $this->set('ad', $this->Ad->find('first', $options));
    }
    

    这将是最简单的代码更改,以确保获得与返回的产品相关的属性。

    否则,你在你的问题中提到了这一点。 您可以通过模型访问相关的模型,因此:

    $this->Ad->Product->find(...);
    

    在使用相关模型时,我遇到了不喜欢我的查找条件的问题,而且我不确定正确的语法,但是如果您想追求这一点,我相信您可以通过文档进行追踪或通过实验。

    最后,我建议你检查ContainableBehavior,这将允许你调整结果中实际返回的字段。 我希望这回答了你的问题!

    链接地址: http://www.djcxy.com/p/64887.html

    上一篇: How do I traverse CakePHP relations?

    下一篇: Cake php model relationships difficulty, esp. hasMany Through