包括相关表格中的单个项目

时间:2014-02-17 17:37:34

标签: php mysql cakephp cakephp-2.4

我有一个名为items的表和一个名为item_pics的表。

item_pics有一个item_idfile_name和一个rank字段(以及其他字段)。


我正在寻找的内容是针对itemindex页面的$items数组,以包含来自{{1}的file_nameitem_pics的{​​{1}}与最低item匹配。所以我可以在我的item_id中访问(或某些之类的):

rank

我是CakePHP的新手,这是我的第一个项目。我认为Items/index.ctp模型中的这个会导致 foreach ($items as $item): $img = $item['Item']['ItemPic']['file_name']; ... 数据被提取(尽管我认为每个Item的所有相关item_pics都会被拉出而不仅仅是最低item_pics):

item

但是我可以看到没有加载rank数据(位于public $hasMany = array( 'ItemPic' => array( 'className' => 'ItemPic', 'foreignKey' => 'item_id', 'dependent' => false ) } 的底部):

item_pics

另外,虽然我希望在items/index页面中加入SELECT `Item`.`id`, `Item`.`title`, `Item`.`description`, `Item`.`created`, `Item`.`modified`, `Item`.`type`, `Project`.`id`, `Project`.`item_id`, `Project`.`title`, `Project`.`description`, `Project`.`rank`, `Project`.`created`, `Project`.`modified` FROM `laurensabc`.`items` AS `Item` LEFT JOIN `laurensabc`.`projects` AS `Project` ON (`Project`.`item_id` = `Item`.`id`) WHERE `Item`.`type` IN (1, 2) LIMIT 20 ,但我并不真正需要projects页面。

我已经做了一些搜索,但却无法找到我正在寻找的内容。我想我可以在view视图项循环中进行查询,但我正在努力确保以正确的方式做事...... CakePHP方式。我想我需要改变一些关于模特关系的事情,但我没有运气。

CakePHP - Associations - HasMany,这看起来好像我可以按排名和限制排序1.但是这不起作用......即使它确实如此,我也不希望这会影响{{1页面,而只是index页面。

我的控制器看起来像这样:

index

我也在我的控制器上试过这个,但它似乎也没有做任何事情:

view

2 个答案:

答案 0 :(得分:1)

首先,在AppModel中设置containable行为(或者如果您不希望在每个模型上使用它,请将其放在Item模型上):

public $actsAs = array('Containable');

然后,在您的查询查询:

$items = $this->Item->find('all', array(
    'contain' => array(
        'ItemPic' => array(
            'fields' => array('file_name'),
            'order' => 'rank',
            'limit' => 1
        )
    )
));

然后你可以像以下那样访问结果数组:

foreach ($items as $item):
    $img = $item['ItemPic']['file_name'];

修改然后你应该把它放在分页查询上:

$this->paginate = array(
    'conditions' => $conditions,
    'contain' => array(
        'ItemPic' => array(
            'fields' => array('file_name'),
            'order' => 'rank',
            'limit' => 1
        )
    )
);

答案 1 :(得分:0)

在这种情况下,我可能按照你所说的排名和限制1进行排序,并将其作为索引页面的动态关联(参见http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#creating-and-destroying-associations-on-the-fly)。所以使用$this->Item->bindModel(array('hasMany' => array('ItemPic' => $options)));(我认为应该替换HasMany ItemPic的当前设置,但您可能必须先取消绑定模型)

通过bindModel创建的关联将仅用于下一个查询,然后它将恢复为您的正常设置,除非您专门设置选项以继续使用新关联。

至于为什么它没有让ItemPics带有Items,或者为什么尝试按等级和限制1排序对你不起作用,我不能说没有看到你的更多代码。