我有一个带有'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;
,但似乎这只返回了类别的第一个项目。
有人可以告诉我我的错误吗?
提前谢谢!
答案 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
可以保存到这些关系中
该示例包含两种处理关系的方法:GridField
和CheckboxSetField
:
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();