我试图遍历CakePHP模型上的关系。 这是数据库:
我可以在产品型号上访问产品属性(product->属性),但我无法访问广告模型上的产品属性(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));
}
以下是我在观点中所做的事情:
//产品视图:snipet of view.ctp
print_r($ product);
//这会打印出产品和所有相关属性
//广告视图:snipet of view.ctp
print_r($ ad ['Product']);
//这将仅打印产品字段,但不打印与产品相关联的属性
有什么问题?如何从我的广告模型中访问关系Ad-> product->属性?
答案 0 :(得分:2)
我可以想到几种简单的方法来实现这一目标。
首先:
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,它将允许您微调结果中实际返回的字段。我希望这能回答你的问题!
答案 1 :(得分:1)
也许问题可能是你没有使用CakePHP的约定。
来自文档:
“新联接表的名称需要包含所涉及的两个模型的名称,按字母顺序排列,并用下划线(_)分隔。”
因此,您的联接表应命名为attributes_products
。
另外,检查您的外键。它们应该是单一的形式。
希望能解决问题。
参考文献: