1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 
	<?php
namespace ICanBoogie\ActiveRecord;
use ICanBoogie\ActiveRecord;
use ICanBoogie\Prototype;
class BelongsToRelation extends Relation
{
    public function __construct(Model $parent, $related, array $options = [])
    {
        if (empty($options['local_key']) || empty($options['foreign_key']))
        {
            if (!($related instanceof Model))
            {
                $related = $parent->models[$related];
            }
            $options += [
                'local_key' => $related->primary,
                'foreign_key' => $related->primary
            ];
        }
        parent::__construct($parent, $related, $options);
    }
    public function __invoke(ActiveRecord $record)
    {
        $key = $record->{ $this->local_key };
        if (!$key)
        {
            return null;
        }
        return $this->resolve_related()[$key];
    }
    protected function alter_prototype(Prototype $prototype, $property)
    {
        parent::alter_prototype($prototype, $property);
        $prototype["set_$property"] = function(ActiveRecord $record, ActiveRecord $related) {
            $record->{ $this->local_key } = $related->{ $this->foreign_key };
        };
    }
    protected function resolve_property_name($related)
    {
        return \ICanBoogie\singularize(parent::resolve_property_name($related));
    }
}