Silverstripe 3 - foreach循环返回多个对象

时间:2014-03-23 15:09:43

标签: php foreach silverstripe

我有一个带有'Categories'字段的ItemObject。在此字段中,相关CategoryPages的ID存储为字符串。例如25,30,8。

现在我想只返回ItemObjects,其中CategoryPage ID在Categories字段的字符串中。

为实现这一目标,我创建了这个功能

public function getItemsForCategory() {
    $items = Item::get();
    foreach($items as $item) {
        $categories = $item->Categories;
        $explode = explode(',', $categories);
        if( in_array($this->ID, $explode) ) {
            echo $item->ID . '<br>';
        }
    }   
}

它为Page中的这一个类别添加了ItemObject的正确ID。所以它可以工作,但我想返回类别的ItemObjects,所以我用echo $item->ID ...;替换return $item;,但似乎这只返回了类别的第一个项目。

有人可以告诉我我的错误吗?

提前谢谢!

1 个答案:

答案 0 :(得分:3)

我会回答你的问题,为什么你的代码不起作用,
但是,我必须警告你,这段代码是错误而我强烈反对使用

您需要了解的是功能如何运作 函数的一个关键规则是&#34; return&#34;表示函数的结束。返回语句意味着在此函数中将不再执行代码,它的结尾 这就是它不起作用的原因。

要让它像这样工作,您需要创建一个数组/列表来存储要返回的项目。

public function getItemsForCategory() {
    // DO NOT USE - I ADVISE AGAINST USING THIS! THERE IS A MUCH BETTER WAY TO HANDLE IT!
    $matchingItems = ArrayList::create();
    $items = Item::get();
    foreach($items as $item) {
        $ids = explode(',', $item->Categories);
        if(in_array($this->ID, $explode)) {
            $matchingItems->add($item);
        }
    }
    return $matchingItems;
}

以正确的方式行事:

同样,我强烈反对使用上面的例子。 请参阅以下示例:正确执行此操作:

SilverStripe附带了一个ORM和一个能够管理1 ... n(has_many)和n ... m(many_many)关系的DataModel。 一些FormFields,包括CheckboxSetField可以保存到这些关系中 该示例包含两种处理关系的方法:GridFieldCheckboxSetField

class CategoryPage extends Page {
    // in template you can then do <% if $Items %> and <% loop $Items %>
    private static $many_many = array(
        'Items' => 'Item',
    );
    public function getCMSFields() {
        $fields = parent::getCMSFields();
        $fields->addFieldToTab('Root', Tab::create('Items', 'The Items');
        $config = GridFieldConfig_RelationEditor::create();
        $fields->addFieldToTab('Root.items', GridField::create(
            'Items',
            'Items for this Category',
            $this->Items(),
            $config
        ));
        return $fields;
    }
}

class Item extends DataObject {
    // in template you can do <% if $Categories %> and <% loop $Categories %>
    private static $belongs_many_many = array(
        'Categories' => 'CategoryPage',
    );
    public function getCMSFields() {
        $map = CategoryPage::get()->map();
        return FieldList::create(array(
            TextField::create('Title', 'Item Name'),
            CheckboxSetField::create('Categories', 'Categories for this Item', $map),
        ));
    }
}

此代码将关系存储在关系数据库中。 SilverStripe将神奇地为关系创建方法:

$categoriesForItem = $item->Categories();

$items= $category->Items();