Nie wiem, czy ten temat jest jeszcze dla niektórych aktualny i interesujący, ale generalnie miałem dokładnie ten sam problem.
Zdecydowałem, że Gas ORM będzie moim maperem w połączeniu z CodeIgniterem. Ponieważ moja struktura bazy danych została podana i nie była zgodna z konwencją table_pk Gas, musiałem zdefiniować klucz obcy przeze mnie, który będzie odwoływał się do mojego niestandardowego klucza obcego bazy danych. Jednak definicja tego nie miała na nic wpływu. Podobnie jak w przypadku powyższego błędu, maper nie był w stanie zbudować właściwej instrukcji SQL. Oświadczenie wyglądało podobnie do twojego:
SELECT * FROM partner WHERE partner.pool_id IN (1)
Wygląda na to, że Gas ignoruje samodzielnie zdefiniowane klucze obce i próbuje użyć domyślnej konwencji table_pk. Oznacza to, że pobiera tabelę (w twoim przypadku:pool) i klucz podstawowy (id), łącząc go ze znakiem podkreślenia.
Doszedłem do wniosku, że konstruktor orm.php obsługuje każdy klucz podstawowy i obcy zdefiniowany w ramach encji. W wierszu 191 kod wywołuje klauzulę if połączoną z pusty funkcja php. Ponieważ klucz podstawowy jest zdefiniowany zawsze i nie ma negacji w instrukcji, za każdym razem pomija wewnętrzną część klauzuli. Jednak wewnętrzna część zajmuje się samodzielnie zdefiniowanymi kluczami obcymi.
Krótko mówiąc, dodałem negację (!) w wierszu 191 pliku orm.php, który prowadzi do następującego kodu:
if ( ! empty($this->primary_key))
{
if ( ! empty($this->foreign_key))
{
// Validate foreign keys for consistency naming convention recognizer
$foreign_key = array();
foreach($this->foreign_key as $namespace => $fk)
{
$foreign_key[strtolower($namespace)] = $fk;
}
$this->foreign_key = $foreign_key;
}
else
{
// If so far we didnt have any keys yet,
// then hopefully someone is really follow Gas convention
// while he define his entity relationship (yes, YOU!)
foreach ($this->meta->get('entities') as $name => $entity)
{
if ($entity['type'] == 'belongs_to')
{
$child_name = $entity['child'];
$child_instance = new $child_name;
$child_table = $child_instance->table;
$child_key = $child_instance->primary_key;
$this->foreign_key[strtolower($child_name)] = $child_table.'_'.$child_key;
}
}
}
}
Cóż, ta mała poprawka bardzo mi pomogła i mam nadzieję, że niektórzy z was również skorzystają z tej wskazówki.