Question

I'm building a application using Kohana 3.2 and Kohana ORM.

The application has systems. Systems contain components. A system may contain multiple components, but also multiple components of the same type. E.g. System_A may have 10 Component_Y and 3 Component_Z

So instead of just having two belongs_to fields in my pivot table I also want to store the count.

If I just use a has-many-through I won't be able to access the count. Without ORM I'd just join the count onto the component in SQL, because the count is unique for the System + Component combination and so I can access the count for the component when I visit the object in the context of a certain system.

How best to go about this in Kohana ORM?

Was it helpful?

Solution

I solved it partially this way:

protected $_has_many = array(
        'omvormer' => array(
            'model' => 'omvormer', 
            'through' => 'systeemomvormer'
        ),
        'systeemomvormer' => array(
            'model' => 'systeemomvormer',
        )
    );

I've added the pivot tabel systeemomvormer separately to systeem.

I can now do this:

$so = ORM::factory("systeemomvormer");
$so->where('systeem_id', '=', $systeem_id);
$so->where('omvormer_id', '=', $omvormer_id);
$result = $so->find();
$result->aantal = $omvormer_count;

But it really still only is a partial solution, because I'm not able to update() the result. Kohana says that the result is not loaded. However that's outside the scope of this question and I'll open a new question for that.

This was also helpfull: http://forum.kohanaframework.org/discussion/7247/kohana-3-orm-save-for-update-a-many-to-many/p1

OTHER TIPS

To store more data in a junction table than just the two keys, you need to create a model for it.

So,

system _has_many system_component
component _has_many system_component
system_component _belongs_to component
system_component _belongs_to system

However, you may not need to store the count if you do it this way. Instead, you can do the following:

$system->components->count_all();

Then, to access them:

foreach($system->components->find_all() as $component)
  echo $component->component->name;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top