How to use getReferencedTable()
- dfx413
- Member | 9
Hello folks!
I came across a problem with \Nette\Database which is probably caused by my
misunderstanding of how to use it properly.
I've got table client_action_product
which points at tables
client_action
and product
using foreign keys named
product_id
and client_action_id
. I am trying to
access the product
table using this query:
foreach ($this->getActions()->where('cancelled IS NULL') as $action) {
if ($action->related('client_action_product')->getReferencedTable('product','product_id')->where('type LIKE ?','%whatever%')->count() > 0) {
return true;
}
There is no problem getting to the client_action_product
table
but I am not able to get past the getReferencedTable
call. It does
not return anything and I don't know why.
I tried to change the column
parameter of that method to
id
but the result is the same. I expected to have
Selection
which I could further work with but I still get
nothing.
Getting a single row from product
using
$action->related('client_action_product')->fetch()->ref('product','product_id')->toArray()
works without problems but this way I would have to iterate over the related
products using another foreach
and check the condition everytime
which looks to me as less elegant and slower (not that the speed matters much in
this particular case).
If anyone could give me some advice I would be thankful.
Last edited by dfx413 (2012-04-08 01:00)
- petr.pavel
- Member | 535
I haven't been using NDB for some time (switched to NotORM) but here are my five cents:
- Is the final SQL query what you'd expect? You can see by switching on the debug panel. If the SQL query is wrong, please send both what you want it to be and what it is now.
- In NotORM (and I suspect in NDB too) you can get joined fields into the
SELECT clause by using dots and colons. E.g.
$db->table('client_action')->select('client_action_product:product.name');
Colons are for 1:many, dots for many:1. This probably isn't what you'd want to use in your loop but anyway. You might want to use it as a workaround.