Faz tempo que trabalho com Code Igniter e gosto muito do Datamapper (leia mais sobre este ORM aqui). Hoje surgiu uma necessidade nova em um projeto e achei interessante o suficiente para compartilhar aqui. Em uma relação many to many, como selecionar objetos que não tenham um relacionamento específico?
Por exemplo, tenho os models product e category, com relacionamento de muitos para muitos nos dois casos (um produto pode ter várias categorias e uma categoria pode ter vários produtos).
Como selecionar produtos que não estejam na categoria canecas, por exemplo?
A resposta curta é: subqueries.
// query para pegar todos os produtos que tem categoria "canecas"
$sub_products = new Product();
$sub_products->select('id')->where_related_category('name', 'canecas');
// Agora usando subqueries, pega todos que não estão na categoria
$products = new Product();
$products->where_not_in_subquery('id', $sub_products)->get();
E se você precisa selecionar por exemplo todos os produtos que não estão relacionados com nenhuma categoria é só fazer um select que atenda na sua subquery, como por exemplo:
$sub_products->select('id')->where_related_category('id > 0');
Tem uma solução diferente? Deixa aí nos comentários!