我如何遍历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
。
另外,检查你的外键。 它们应该是单数形式。
希望解决这个问题。
参考文献:
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