相关表ORM Kohana的条件

时间:2014-06-19 12:22:28

标签: php orm kohana

例如,我有3个表:

songs(id, song_name)
song_category(id, song_id, category_id)
categories(id, name)

我希望获得ID大于5的类别的歌曲。我想使用ORM,而不是使用简单的SQL查询。是否可以使用以下一个查询来执行此操作:

$songs = ORM::factory("songs")->where("category.id > 5")

1 个答案:

答案 0 :(得分:0)

不,你不能通过一次Kohana ORM电话来做到这一点。

我发现这样做的最好方法就是这样,它会修改ORM将生成的SQL查询:

// Get the basic "song" model
$songs = ORM::factory("songs");

// Get the information about how it is connected to
// the "category" model using the `through` model
$song_relations = $results->has_many();
$category_relation = $song_relations['categories'];
$through = $category_relation['through'];

// Join on `through` model's target foreign key (far_key) and `target` model's primary key
$join_col1 = $through.'.'.$category_relation['foreign_key'];
$join_col2 = $songs->object_name().'.'.$songs->primary_key();
$songs->join($through)->on($join_col1, '=', $join_col2);

// Now, filter on the 
$songs->where($through.'.'.$category_relation['far_key'], '>', 5);

$arr = $results->find_all()->as_array();

您可以通过在join方法调用中对值进行硬编码来保存一些代码,但这样可以利用您已有的ORM关系定义。

这假设您的Song模型中包含以下代码:

protected $_has_many = [
    'categories' => [
        'model'       => 'category',
        'through'     => 'song_category',
        'foreign_key' => 'song_id',
        'far_key'     => 'category_id',
    ]
];