Laravel源码阅读第一次

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
\n"; $args_list = func_get_args(); for ($i =0; $i < $args_num; $i++) { echo "Argument $i is: ".func_get_arg($i)."
"; } } 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'],
    ]
*/

你可能感兴趣的:(Laravel源码阅读第一次)