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

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:

$a = new A($id);

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

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

$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.

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).

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.

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

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

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