例如,我有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")
答案 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',
]
];