SilverStripe db выберите совпадение нескольких ключей

#php #silverstripe

#php #silverstripe

Вопрос:

Как вы можете выбирать строки из таблицы БД на основе нескольких «идентификаторов»?

Совпадение одного ключа

 $id = 42;
DataObject::get('Foo')->where("ID = '$id'");
  

Совпадение нескольких ключей

 $id = array(42, 43, 44);
DataObject::get('Foo')->where( ??? );
  

Во втором случае он должен возвращать список строк с идентификатором 42, 43 или 44.

Комментарии:

1. Не знаком с SilverStripe, но, возможно IN , оператор SQL подтолкнет вас в правильном направлении.

Ответ №1:

SilverStripe ORM знает, как создавать where in запросы:

 $ids = array(42, 43, 44);
$items = Foo::get()->byIDs($ids);
  

Для любых других наборов вы должны использовать DataList::filter() метод;

 $products = Product::get()->filter('Category', array('shirts', 'shoes'));
  

Комментарии:

1. Приятно знать. Любой простой способ предоставить список данных, например $ids = Bar::get()->column("TheIDs"); , вместо массива?

2. Тогда похоже, что Foo и Bar связаны. Возможно, лучше использовать отношение has_many?

3. Вы правы, я установил has_many связь. Я должен иметь возможность перебирать внешнюю таблицу (Foo) в интерфейсе справа?

Ответ №2:

Кажется, это работает:

 $id = implode(',', array(42, 43, 44));

$items = DataObject::get('Foo')->where("ID IN ($id)");