调用delete()会导致服务器错误

SIl*_*bie 1 php silverstripe

为什么我delete()在Silverstripe中导致服务器错误?以下是代码:

$product = Product::create();
$product = Product::get()->filter(array('Price' => 26.32));
$product->delete();     
Run Code Online (Sandbox Code Playgroud)

以上是在requireDefaultRecords()/ dev/build?flush中运行的

3dg*_*goo 7

Product::get()->filter(array('Price' => 26.32))将返回一个DataList,而不是一个Product对象.这是因为Product::get()->filter()可以找到多个产品.DataList即使filter函数只找到一个项目,这仍然会返回.

您需要做的是浏览每个项目DataList并删除每个项目.

$newProduct = Product::create();
$products = Product::get()->filter(array('Price' => 26.32));

foreach ($products as $product) {
    $product->delete(); 
}
Run Code Online (Sandbox Code Playgroud)

  • `$ products-> removeAll()`也可以.它调用`remove()`,它为列表中的每个项调用`removeByID($ id)`和`delete()` (2认同)
  • @elliot_at_silverstripe,不幸的是,API被称为`removeAll`而不是`deleteAll`,因为有`filter`,名称暗示它只是从列表中删除,而不是从DB中删除.当你将`DataList`转换为`ArrayList`时,或者当你越过`HasManyList`时,这就成了一个问题,`remove`的含义发生了变化. (2认同)