CakePHP关联查询问题:如何获取关联的关联数据
解决方案:获取关联的Markups表数据
你只需要在contain里嵌套关联就能拿到Markups的完整数据啦,因为你的关联层级是Offers -> Products -> Markups,当前的查询只包含了Products,没有继续包含它关联的Markups。
方法1:嵌套Contain推荐写法
直接在Products的contain里加上Markups,CakePHP支持这种嵌套的关联包含:
$offersObject = $this->paginate( $this->Offers->find('all') ->contain(['Products' => ['Markups']]) );
这样查询后,每个Offer对象里的Product属性下,就会有对应的Markup对象包含完整的Markups表行数据,而不只是markup_id。
方法2:手动Join可选,适合复杂查询
如果需要对Markups数据做额外过滤或者更精细的字段选择,可以用手动Join的方式:
$offersObject = $this->paginate( $this->Offers->find('all') ->join([ 'Products' => [ 'table' => 'products', 'type' => 'INNER', 'conditions' => 'Products.id = Offers.product_id' ], 'Markups' => [ 'table' => 'markups', 'type' => 'INNER', 'conditions' => 'Markups.id = Products.markup_id' ] ]) ->select([ 'Offers.id', 'Offers.product_id', // 按需选择Offer字段 'Products.name', 'Products.markup_id', // 按需选择Product字段 'Markups.percentage', 'Markups.description' // 按需选择Markups字段 ]) );
注意这里的表名要和你数据库里的实际表名一致,如果你的表名是复数形式比如markups,要对应正确。
额外检查点
确认你的关联定义没有问题:
- ProductsTable里已经正确定义了
belongsTo('Markups'),外键markup_id和joinType都设置对了,这是嵌套contain能生效的前提。 - Markups表的主键是
id,和Products表的markup_id对应匹配。
这样调整后,你就能拿到完整的Markups关联数据啦!
内容的提问来源于stack exchange,提问作者Michał Skrzypek
相关产品推荐
相关产品推荐

