Welcome Guest, Not a member yet? Register   Sign In
Datamapper: more direct access to join fields
#1

[eluser]Dracos[/eluser]
I've got two models, let's call them A and B, in a one to many relationship (A has one B, B has many A's).

The A_B table has extra fields, including A_B.foo.

I know that I can do this:

Code:
$a = new A($id);
$a->b->include_join_fields()->get()

The result is all the fields of B plus the join fields, because the query begins

Code:
SELECT B.*, A_B.id as join_id, A_B.foo as join_foo [...]

My question: is there a way, having instantiated A, to get the A fields with the join fields, and not reference B at all? Such as

Code:
$a = new A($id);

// some code

// resulting query
// SELECT A.*, A_B.id as join_id, A_B.foo as join_foo [...]

The reason I ask is that I will be dealing with sizable sets of $a->get() results where I want to include the A_B join fields, but I don't actually want the B fields, or to even instantiate B.
#2

[eluser]WanWizard[/eluser]
In more complex cases with join fields I usually split the relation.

So instead of having a many-many between A en B, I create a many to one between A and AB, and a many to one between B and AB (where AB is your relationship table).

Create a model for your relationship table, and you can query it like any normal relation.

Downside of this is that you have to either use deep relations (AB->B) when querying B from A, or define two relations, one from A to B (many to many) and one from A to AB (many to one).
#3

[eluser]Dracos[/eluser]
Thanks WanWizard.

It would seem to me that modifying include_join_fields() to take $model as an argument (class name string, instance, or an array of these) could solve this (also optionally a second argument for a list of desired join fields). Or introducing a new function the achieve the same end.

Code:
$a = new A($id);
$a->include_join_fields('B', 'foo')->get();

// result: $a now includes the A_B.foo join field
#4

[eluser]WanWizard[/eluser]
It's not really natural to use custom methods for this functionality.

The next version of DM will not have them anymore, but will use the model approach (where you will define a A many-to-many B through AB).




Theme © iAndrew 2016 - Forum software by © MyBB