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!