Builder::select
源码
public function select($columns = ['*'])
{
$this -> columns = is_array($columns) ? $columns : func_get_args();
//设置被选择的字段
//如果被选择的字段是一个数组,那么设置当前query的clumns为这个数组
//如果被选择的字段不是一个数组,用func_get_args把这些参数变成一个数组
return $this;
}
示例
$builder = User::where("id", 160124) -> select("id", "realname", "nickname");
$builder = User::where("id", 160124) -> select(["id", "realname", "nickname"]);
dump($builder->get());
代码分析
首先让我感到疑惑的是,为什么函数的形参可以和传递过来的实参不一一对应。于是我发现了func_get_args()
的作用。
func_get_args()
:获取函数的所有参数。
func_get_arg($index)
:传递一个下标,可以获得参数列表中对应的参数。
func_num_args()
:获取函数参数的个数。
function foo(){
$args_num = func_num_args();
echo "Number of arguments: $args_num<br/>\n";
$args_list = func_get_args();
for ($i =0; $i < $args_num; $i++) {
echo "Argument $i is: ".func_get_arg($i)."<br/>";
}
}
foo(1,2,3);
输出
Number of arguments: 3
Argument 0 is: 1
Argument 1 is: 2
Argument 2 is: 3
Builder::addSelct,Builder::selectRaw
两个函数具有相同作用
源码
public function addSelect($column)
{
//往被选择的字段添加字段,即扩充被选择字段
//参数支持数组和多个字符串
$column = is_array($column) ? $column : func_get_args();
$this->columns = array_merge((array) $this->columns, $column);
return $this;
}
示例
$builder = User::where("id", "160124") ->select("id", "realname") -> selectRaw("nickname");
$builder = User::where("id", "160124") ->select(["id"]) -> addSelect(["nickname", "realname"]);
dump($builder->get());
selectSub
完全看不懂在说什么,o(╯□╰)o,可以参考以下信息。
StackOverFlow参考
distinct
据说是去重,但是不知道怎么用。
源码
public function distinct(){
//Force the query to only return distinct results.
$this->distinct = true;
return $this;
}
在Laravel中想要针对某个字段去重可以使用unique
。
unique
方法返回集合中所有的唯一数据项:
$collection = collect([1, 1, 2, 2, 3, 4, 2]);
$unique = $collection->unique();
$unique->values()->all();
// [1, 2, 3, 4]
返回的集合保持原来的数组键,在本例中我们使用values方法重置这些键为连续的数字索引。
处理嵌套数组或对象时,可以指定用于判断唯一的键:
$collection = collect([
['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],
['name' => 'iPhone 5', 'brand' => 'Apple', 'type' => 'phone'],
['name' => 'Apple Watch', 'brand' => 'Apple', 'type' => 'watch'],
['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],
['name' => 'Galaxy Gear', 'brand' => 'Samsung', 'type' => 'watch'],
]);
$unique = $collection->unique('brand');
$unique->values()->all();
/*
[
['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],
['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],
]
*/
你还可以指定自己的回调用于判断数据项唯一性:
$unique = $collection->unique(function ($item) {
return $item['brand'].$item['type'];
});
$unique->values()->all();
/*
[
['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],
['name' => 'Apple Watch', 'brand' => 'Apple', 'type' => 'watch'],
['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],
['name' => 'Galaxy Gear', 'brand' => 'Samsung', 'type' => 'watch'],
]
*/