Как удалить элемент из набора результатов в Cake PHP 3? - PullRequest
0 голосов
/ 12 марта 2020

Я хотел бы удалить некоторые указанные элементы из ResultSet, что означает, что мне нужен объект ResultSet в конце.

Есть ли способ удалить элемент из ResultSet или создать другой ResultSet из существующего ResultSet?

Я пытался использовать filter () или reject (). Но они не возвращают объект ResultSet?

$ids = [123, 234, 456];
$results = $this->find()
             ->where(['xxx' => 'xxxx'])
             ->all();

$newResults = $results->filter(function ($result) {
    return in_array($result->id, $ids);
});

1 Ответ

3 голосов
/ 12 марта 2020

Я бы спросил, действительно ли вам нужен набор результатов, то есть объект, который реализует \Cake\Datasource\ResultSetInterface.

Результат интерфейс set - это просто комбинация \Cake\Collection\CollectionInterface, \Countable и \Serializable, что почти удовлетворяется CakePHP обычный класс коллекции, ie \Cake\Collection\Collection, ему просто не хватает \Countable::count(). Таким образом, коллекция, возвращаемая вашим filter() вызовом, должна в большинстве случаев удовлетворять ваши потребности.

Если по какой-то причине вам придется пройти реализацию \Cake\Datasource\ResultSetInterface, и вы абсолютно не можете изменить этот контракт ни на что По этой причине вы всегда можете передать свои данные новому декоратору набора результатов:

$resultSet = new \Cake\Datasource\ResultSetDecorator($collection->toArray());

Также вы можете манипулировать вашими данными на уровне запроса, просто не получая данные, которые вам не нужны, в Во-первых, ie исключите их в ваших where() условиях или, отфильтровав в средство форматирования результата , вы сразу получите уменьшенный объект \Cake\Datasource\ResultSetInterface из вашего запроса. :

$results = $this
    ->find()
    ->where(['xxx' => 'xxxx'])
    ->formatResults(function (\Cake\Collection\CollectionInterface $results) {
        return $results->filter(/* ... */);
    })
    // ...
...