2019年7月

我的个人博客:逐步前行STEP

示例:
1、将文章按类型的分组,并获取类型分组中最新的一篇文章

select author,max(`updated_at`) as updated_at from articles 
    group by category_id
    order by updated_at desc

2、将文章按类型的分组,并获取类型分组中阅读量最小的一篇文章

select author,min(`read_cnt`) as read_cnt from articles 
    group by category_id
    order by read_cnt

我的个人博客:逐步前行STEP

1、执行单例测试

./vendor/bin/phpunit

2、执行指定单例测试文件

./vendor/bin/phpunit   tests/BlogTest.php

3、执行指定测试函数

./vendor/bin/phpunit  --filter testPostArticle

4、执行指定文件的指定测试函数

./vendor/bin/phpunit  --filter testPostArticle  tests/BlogTest.php

我的个人博客:逐步前行STEP

1、first

返回集合第一个通过指定测试的元素:

collect([1, 2, 3, 4])->first();

// 1
collect([1, 2, 3, 4])->first(function ($value, $key) {
    return $value > 2;
});

// 3

2、last

返回集合中,最后一个通过指定测试的元素:

collect([1, 2, 3, 4])->last(function ($value, $key) {
    return $value < 3;
});

// 2
collect([1, 2, 3, 4])->last();

// 4

3、keyBy

以指定键的值作为集合项目的键。如果几个数据项有相同的键,那在新集合中只显示最后一项:

$collection = collect([
    ['product_id' => 'prod-100', 'name' => 'desk'],
    ['product_id' => 'prod-200', 'name' => 'chair'],
]);

$keyed = $collection->keyBy('product_id');

$keyed->all();

/*
    [
        'prod-100' => ['product_id' => 'prod-100', 'name' => 'Desk'],
        'prod-200' => ['product_id' => 'prod-200', 'name' => 'Chair'],
    ]
*/
$keyed = $collection->keyBy(function ($item) {
    return strtoupper($item['product_id']);
});

$keyed->all();

/*
    [
        'PROD-100' => ['product_id' => 'prod-100', 'name' => 'Desk'],
        'PROD-200' => ['product_id' => 'prod-200', 'name' => 'Chair'],
    ]
*/

4、map

遍历整个集合并将每一个数值传入回调函数。回调函数可以任意修改并返回项目,形成修改过的项目组成的新集合

$collection = collect([1, 2, 3, 4, 5]);

$multiplied = $collection->map(function ($item, $key) {
    return $item * 2;
});

$multiplied->all();

// [2, 4, 6, 8, 10]

5、mapWithKeys

遍历整个集合并将每一个数值传入回调函数。回调函数返回包含一个键值对的关联数组

$collection = collect([
    [
        'name' => 'John',
        'department' => 'Sales',
        'email' => 'john@example.com'
    ],
    [
        'name' => 'Jane',
        'department' => 'Marketing',
        'email' => 'jane@example.com'
    ]
]);

$keyed = $collection->mapWithKeys(function ($item) {
    return [$item['email'] => $item['name']];
});

$keyed->all();

/*
    [
        'john@example.com' => 'John',
        'jane@example.com' => 'Jane',
    ]
*/

6、merge

合并数组进集合。数组「键」对应的数值会覆盖集合「键」对应的数值:

$collection = collect(['product_id' => 1, 'price' => 100]);

$merged = $collection->merge(['price' => 200, 'discount' => false]);

$merged->all();

// ['product_id' => 1, 'price' => 200, 'discount' => false]

7、only

返回集合中指定键的所有项目

$collection = collect(['product_id' => 1, 'name' => 'Desk', 'price' => 100, 'discount' => false]);

$filtered = $collection->only(['product_id', 'name']);

$filtered->all();

// ['product_id' => 1, 'name' => 'Desk']

8、pluck

获取集合中指定「键」所有对应的值

$collection = collect([
    ['product_id' => 'prod-100', 'name' => 'Desk'],
    ['product_id' => 'prod-200', 'name' => 'Chair'],
]);

$plucked = $collection->pluck('name');

$plucked->all();

// ['Desk', 'Chair']
$plucked = $collection->pluck('name', 'product_id');

$plucked->all();

// ['prod-100' => 'Desk', 'prod-200' => 'Chair']

9、reduce

reduce 方法将集合缩减到单个数值,该方法会将每次迭代的结果传入到下一次迭代

$collection = collect([1, 2, 3]);

$total = $collection->reduce(function ($carry, $item) {
    return $carry + $item;
});

// 6
第一次迭代时 $carry 的数值为 null;然而你也可以传入第二个参数进 reduce 以指定它的初始值:

$collection->reduce(function ($carry, $item) {
    return $carry + $item;
}, 4);

// 10

10、search

search 方法在集合内搜索指定的数值并返回找到的键。假如找不到项目,则返回 false

$collection = collect([2, 4, 6, 8]);

$collection->search(4);

// 1
$collection->search(function ($item, $key) {
    return $item > 5;
});

// 2

我的个人博客:逐步前行STEP

安装MongoDB

1、下载源码

在mongodb官方下载自己需要的版本:https://www.mongodb.com/download-center/community

2、解压

tar -zxvf mongodb-linux-x86_64-4.0.6.tgz

3、创建配置文件

#vi mongodb.conf
写入:
port=27017 #端口
dbpath=/usr/local/mongodb/data #数据库存文件存放目录
logpath=/usr/local/mongodb/log/mongodb.log #日志文件存放路径
logappend=true #使用追加的方式写日志
fork=true #以守护进程的方式运行,创建服务器进程
maxConns=100 #最大同时连接数
noauth=true #不启用验证
journal=true #每次写入会记录一条操作日志(通过journal可以重新构造出写入的数据)。
#即使宕机,启动时wiredtiger会先将数据恢复到最近一次的checkpoint点,然后重放后续的journal日志来恢复。
storageEngine=wiredTiger  #存储引擎有mmapv1、wiretiger、mongorocks
bind_ip = 0.0.0.0  #这样就可外部访问了,例如从win10中去连虚拟机中的MongoDB

5、配置环境变量

#vi /etc/profile
写入:export PATH=/usr/local/mongodb/bin:$PATH
#source /etc/profile

6、使用配置文件启动mongo

mongo -f /usr/local/mongo/mongodb.conf

7、将mongodb配置成服务

vi /etc/init.d/mongodb
写入:
#!/bin/sh
#
#mongod - Startup script for mongod
#
# chkconfig: - 85 15
# description: Mongodb database.
# processname: mongod
# Source function library

. /etc/rc.d/init.d/functions
# things from mongod.conf get there by mongod reading it
# OPTIONS
OPTIONS=" -f /usr/local/mongodb/mongodb.conf  &"
#mongod
mongod="/usr/local/mongodb/bin/mongod"
lockfile=/var/lock/subsys/mongod
start()
{
  echo -n $"Starting mongod: "
  daemon $mongod $OPTIONS
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && touch $lockfile
}

stop()
{
  echo -n $"Stopping mongod: "
  killproc $mongod -QUIT
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && rm -f $lockfile
}

restart () {
        stop
        start
}
ulimit -n 12000
RETVAL=0

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart|reload|force-reload)
    restart
    ;;
  condrestart)
    [ -f $lockfile ] && restart || :
    ;;
  status)
    status $mongod
    RETVAL=$?
    ;;
  *)
    echo "Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"
    RETVAL=1
esac
exit $RETVAL

将启动脚本设置可执行权限

chmod +x /etc/init.d/mongodb

8、设置开机启动

chkconfig   --add  mongodb
chkconfig mongodb on

9、开启、关闭mongodb服务

service mongodb start
service mongodb stop
service mongodb restart