这就是我现在所拥有的:
function getAlbum(){
$args = func_get_args();
if(!(count($args) % 2) || count($args) == 1) {
trigger_error('Argument count must be an odd number and greater than one.');
return false;
}
$q = new Query("album_manager");
$q->select($args[0]);
unset($args[0]);
call_user_func_array(array($q, "where"),$args);
$q->limit(1);
return send_back_as_array($q);
}
如果您致电getAlbum('*','cid',1)
,则会获得cid=1
的所有属性
如果您致电getAlbum('cid, anchor', 'cid',1)
,则会获得anchor
和cid
cid=1
它运行正常,但我担心当有人调试代码时,他们可能会误将,
和cid
之间的anchor
误认为是参数分隔符而感到困惑。
有没有人有更优雅的解决方案?我只是感兴趣。
我考虑将其更改为接受getAlbum('cid','anchor','where:','cid',1)
的位置,但我不确定会更好。
这就是我改为:
function getAlbum(){
// argument one is a comma separated value or an array of what is requested.
// the rest of the args must be an even number (odd number of args overall)
// ever even argument is a selector and every odd is a condition 'selector = condition' in query
// Examples:
// getAlbum('*','cid',1); <- Select all attributes from album where cid = 1
// getAlbum('cid','anchor','test','name','This is a test'); <- select cid from album where anchor = 'test' and 'name' = 'This is a test'
// getAlbum(array('cid','anchor'),'test','name'); select cid and anchor where 'test'='name'
// getAlbum('cid, anchor','cid',1); select cid and anchor where cid=1
$args = func_get_args();
if(!(count($args) % 2) || count($args) == 1) {
trigger_error('Argument count must be an odd number and greater than one.');
return false;
}
$q = new Query("album_manager");
$q->select((is_array($args[0]) ? implode(", ",$args[0]) : $args[0]));
unset($args[0]);
call_user_func_array(array($q, "where"),$args);
$q->limit(1);
$array = send_back_as_array($q);
if(count($array) != 1) return false;
else return $array;
}
答案 0 :(得分:3)
一个数组怎么样,并用逗号插入其元素?
$q->select(is_array($args[0]) ? implode(', ', $args[0]) : $args[0]);
致电代码:
getAlbum(array('cid', 'anchor'), 'cid', 1);
编辑:那么听起来就好了,因为select()
方法会自动处理数组。
答案 1 :(得分:1)
您可以执行以下操作:
$album = Album::select('cid', 'anchor')->where('cid', 1)->findOne();
$albums = Album::select('cid', 'anchor')->find();
select
函数可以返回某种查询构建器的新实例。它的每个成员函数都将返回$this
,以便您可以将调用链接在一起。如果查询构建器实现了迭代器,那么最终的find()
方法可以是可选的,因为在大多数情况下你可以这样做:
foreach(Album::select('cid', 'anchor') as $album) {}
有几种不同的方法可以像这样链接在一起;我不是主张将上述风格作为最佳版本,而只是简单说明其中一种方式。
如果你不是在考虑进行如此彻底的改变,那么你所做的事情就不会那么明显了。几种可能性:您可以将选定的字段组合成单个字符串或数组,或者您可以使用命名数组参数(但这样会匆忙得到详细信息)。
答案 2 :(得分:1)
根据函数的使用方式和方式,尝试将数组传递给函数。在函数内部确保如果需要设置默认值(如果未传递变量)则恢复正常。即:
function getAlbum($options) {
$fields = array_key_exists('fields', $options) ? $options['fields'] : '';
$where = array_key_exists('where', $options) ? $options['where'] : array();
[do stuff]
return $data;
}
$options = array('fields' => 'cid,anchor',
'where' => array('cid' => 1)
);
这样,随着函数的发展,您可以传递其他值,而不必担心稍后更改参数的结构/顺序。
答案 3 :(得分:0)
我想,我更喜欢getAlbum(array('cid','anchor'),'cid',1)
。这看起来很清楚,根据用例你可以写:
getAlbum(array(
'cid',
'anchor'
),'cid',1)