У меня есть две модели болезни и симптома:
болезнь
class Model_Illness extends ORM {
//protected $_db_group = 'default2';
protected $_table_name = 'illnesses';
protected $_has_many = array(
'symptoms' => array(
'through' => 'symptoms_illnesses',
'foreign_key' => 'illness_id',
)
);
симптом
class Model_Symptom extends ORM {
//protected $_db_group = 'default2';
protected $_table_name = 'symptoms';
protected $_has_many = array(
'illnesses' => array(
'through' => 'symptoms_illnesses',
'foreign_key' => 'symptom_id',
)
);
Логика в том, что болезнь может иметь много симптомов, а симптом может иметь много болезней. Таким образом, эти двое имеют средний стол symptoms_illnesses
который хранит идентификаторы взаимосвязанных болезней и симптомов.
Наконец моя задача: я должен искать болезни по симптомам. Я отправляю идентификаторы симптомов в массиве, а затем должен получить болезни, которые имеют только эти симптомы. Я попробовал следующую функцию:
public function bySymp($symps){
$res = array();
$objs = ORM::factory('Illness')->join('symptoms_illnesses')
->on('symptoms_illnesses.illness_id', '=', 'illness.id');
foreach($symps as $s){
$objs = $objs->where('symptoms_illnesses.symptom_id', '=', $s);
}foreach($objs->find_all() as $o){
$res[] = $o;
}
return $res;
}
Ничего не возвращается, когда я помещаю более одного значения в массив. Я тоже пробовал $objs = $this->where('symptom_id', 'IN', $symptom_ids);
это работает как условие «ИЛИ», но я должен вывести именно такие заболевания, которые имеют симптомы в массиве идентификаторов симптомов.
Я думаю, вам нужно сделать несколько объединений, по одному на каждый симптом. Но быстрый взгляд на документацию Kohana показывает, что она не учитывает псевдонимы внутри запросов, поэтому создание WHERE
пункт сложно / невозможно.
Единственный способ увидеть, что это работает из коробки, — это сначала найти все болезни, а затем проверить через has()
для требуемых симптомов.
$res = array();
$objs = ORM::factory('Illness')->find_all();
foreach ($objs as $o) {
if ($o->has('symptom', $symps)) {
$res[] = $o;
}
}
return $res;
Но я некоторое время не работал с Коханой и мог что-то упустить из виду.
Других решений пока нет …