Categories
php

migration 使用

为了laravel 数据库迁移 migration使用

按照某个model构建 mirgration

php artisan make:migration create_flights_table --create=flights

按照现有的数据库 dump一下

php artisan schema:dump

// Dump the current database schema and prune all existing migrations...
php artisan schema:dump --prune

migration文件例子

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateFlightsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('flights', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('airline');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('flights');
    }
}

执行migration

php artisan migrate

scheme详解

建表

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

Schema::create('users', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('email');
    $table->timestamps();
});

检查

if (Schema::hasTable('users')) {
    // The "users" table exists...
}

if (Schema::hasColumn('users', 'email')) {
    // The "users" table exists and has an "email" column...
}

指定连接

Schema::connection('sqlite')->create('users', function (Blueprint $table) {
    $table->id();
});

指定表储存引擎

Schema::create('users', function (Blueprint $table) {
    $table->engine = 'InnoDB';

    // ...
});

指定字符集

Schema::create('users', function (Blueprint $table) {
    $table->charset = 'utf8mb4';
    $table->collation = 'utf8mb4_unicode_ci';

    // ...
});

更改字段(和创建字段一样)

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

Schema::table('users', function (Blueprint $table) {
    $table->integer('votes');
});

表改名

Schema::rename($from, $to);

删除表

Schema::drop('users');

Schema::dropIfExists('users');

所有的字段类型

bigIncrements bigInteger binary boolean char dateTimeTz dateTime date decimal double enumfloat foreignId geometryCollection geometry id increments integer ipAddress json jsonb lineString longText macAddress mediumIncrements mediumInteger mediumText morphs multiLineString multiPoint multiPolygon nullableMorphs nullableTimestamps nullableUuidMorphs point polygon rememberToken set smallIncrements smallInteger softDeletesTz softDeletes stringtext timeTz time timestampTz timestamp timestampsTz timestampstinyIncrements tinyInteger unsignedBigInteger unsignedDecimal unsignedInteger unsignedMediumInteger unsignedSmallInteger unsignedTinyInteger uuidMorphs uuid year

更改字段

Schema::table('users', function (Blueprint $table) {
    $table->string('name', 50)->change();
});

字段改名

Schema::table('users', function (Blueprint $table) {
    $table->renameColumn('from', 'to');
});

舍弃字段

Schema::table('users', function (Blueprint $table) {
    $table->dropColumn('votes');
});

Schema::table('users', function (Blueprint $table) {
    $table->dropColumn(['votes', 'avatar', 'location']);
});
CommandDescription
$table->dropMorphs('morphable');Drop the morphable_id and morphable_type columns.
$table->dropRememberToken();Drop the remember_token column.
$table->dropSoftDeletes();Drop the deleted_at column.
$table->dropSoftDeletesTz();Alias of dropSoftDeletes() method.
$table->dropTimestamps();Drop the created_at and updated_at columns.
$table->dropTimestampsTz();Alias of dropTimestamps() method.

索引约束

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

Schema::table('users', function (Blueprint $table) {
    $table->string('email')->unique();
});

$table->unique('email');

$table->index(['account_id', 'created_at']);

$table->unique('email', 'unique_email');
CommandDescription
$table->primary('id');Adds a primary key.
$table->primary(['id', 'parent_id']);Adds composite keys.
$table->unique('email');Adds a unique index.
$table->index('state');Adds an index.
$table->spatialIndex('location');Adds a spatial index (except SQLite).

更改索引

$table->renameIndex('from', 'to')

删除索引(约束)

CommandDescription
$table->dropPrimary('users_id_primary');Drop a primary key from the “users” table.
$table->dropUnique('users_email_unique');Drop a unique index from the “users” table.
$table->dropIndex('geo_state_index');Drop a basic index from the “geo” table.
$table->dropSpatialIndex('geo_location_spatialindex');Drop a spatial index from the “geo” table (except SQLite).

外键约束

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

Schema::table('posts', function (Blueprint $table) {
    $table->unsignedBigInteger('user_id');

    $table->foreign('user_id')->references('id')->on('users');
});

//自动推测
Schema::table('posts', function (Blueprint $table) {
    $table->foreignId('user_id')->constrained();
});

Schema::table('posts', function (Blueprint $table) {
    $table->foreignId('user_id')->constrained('users');
});

外键级联

$table->foreignId('user_id')
      ->constrained()
      ->onUpdate('cascade')
      ->onDelete('cascade');

删除外键

$table->dropForeign(['user_id']);
Categories
php

eloquent 使用

简介eloquent 为laravel中的orm模块

以下代码为orm对象生成命令

php artisan make:model Flight //创建Flight orm 对象
php artisan make:model Flight --migration | -m //生成migration数据库迁移文件
# Generate a model and a FlightFactory class...
php artisan make:model Flight --factory
php artisan make:model Flight -f

# Generate a model and a FlightSeeder class...
php artisan make:model Flight --seed
php artisan make:model Flight -s

# Generate a model and a FlightController class...
php artisan make:model Flight --controller
php artisan make:model Flight -c

# Generate a model and a migration, factory, seeder, and controller...
php artisan make:model Flight -mfsc

生成的基本对象:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    //optional
    protected $table = 'my_flights';//指定表名
    protected $primaryKey = 'flight_id'; //指定主键
    public $incrementing = false; //主键生成模式
    protected $keyType = 'string';
 //主键数据类型
    public $timestamps = false;
//是否有create 和 update 时间
    protected $dateFormat = 'U';
 //日期格式
    const CREATED_AT = 'creation_date';
 //创建时间字段名
    const UPDATED_AT = 'updated_date';//更新时间字段名
    protected $connection = 'sqlite';
 //指定该orm数据库连接
    protected $fillable = [] //数组 可批量创建的字段
    protected $guard = [] //数组 不可批量创建的字段

    protected $attributes = [
   //字段默认值
        'delayed' => false,
    ];


}

查询方法:

Flight::all

use App\Models\Flight;

foreach (Flight::all() as $flight) {
    echo $flight->name;
}

查询构造器

$flights = Flight::where('active', 1)
               ->orderBy('name')
               ->take(10)
               ->get();

聚合函数

$count = Flight::where('active', 1)->count();

$max = Flight::where('active', 1)->max('price');

对象collection reject方法剔除取消的航班 (闭包返回true)

$flights = Flight::where('destination', 'Paris')->get();

$flights = $flights->reject(function ($flight) {
    return $flight->cancelled;
});

orm游标

use App\Models\User;

$users = User::cursor()->filter(function ($user) {
    return $user->id > 500;
});

子查询

use App\Models\Destination;
use App\Models\Flight;

return Destination::addSelect(['last_flight' => Flight::select('name')
    ->whereColumn('destination_id', 'destinations.id')
    ->orderByDesc('arrived_at')
    ->limit(1)
])->get();

查一条数据

use App\Models\Flight;

// Retrieve a model by its primary key...
$flight = Flight::find(1);

// Retrieve the first model matching the query constraints...
$flight = Flight::where('active', 1)->first();

// Alternative to retrieving the first model matching the query constraints...
$flight = Flight::firstWhere('active', 1);

查到一条或者(闭包)

model = Flight::where('legs', '>', 3)->firstOr(function () {
    // ...
});

查询报notFound fail方法

$flight = Flight::findOrFail(1);

$flight = Flight::where('legs', '>', 3)->firstOrFail();

静态创建

use App\Models\Flight;

// Retrieve flight by name or create it if it doesn't exist...
$flight = Flight::firstOrCreate([
    'name' => 'London to Paris'
]);

// Retrieve flight by name or create it with the name, delayed, and arrival_time attributes...
$flight = Flight::firstOrCreate(
    ['name' => 'London to Paris'],
    ['delayed' => 1, 'arrival_time' => '11:30']
);

// Retrieve flight by name or instantiate a new Flight instance...
$flight = Flight::firstOrNew([
    'name' => 'London to Paris'
]);

// Retrieve flight by name or instantiate with the name, delayed, and arrival_time attributes...
$flight = Flight::firstOrNew(
    ['name' => 'Tokyo to Sydney'],
    ['delayed' => 1, 'arrival_time' => '11:30']
);

对象创建

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\Flight;
use Illuminate\Http\Request;

class FlightController extends Controller
{
    /**
     * Store a new flight in the database.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        // Validate the request...

        $flight = new Flight;

        $flight->name = $request->name;

        $flight->save();
    }
}

对象更新

use App\Models\Flight;

$flight = Flight::find(1);

$flight->name = 'Paris to London';

$flight->save();

批量更新

Flight::where('active', 1)
      ->where('destination', 'San Diego')
      ->update(['delayed' => 1]);

对象填充数据

$flight->fill(['name' => 'Amsterdam to Frankfurt']);

按条件更新或创建

$flight = Flight::updateOrCreate(
    ['departure' => 'Oakland', 'destination' => 'San Diego'],//条件
    ['price' => 99, 'discounted' => 1] //数据
);
Flight::upsert([
    ['departure' => 'Oakland', 'destination' => 'San Diego', 'price' => 99],
    ['departure' => 'Chicago', 'destination' => 'New York', 'price' => 150]
], ['departure', 'destination'], ['price']);

删除

use App\Models\Flight;

$flight = Flight::find(1);

$flight->delete();
Flight::destroy(1);

Flight::destroy(1, 2, 3);

Flight::destroy([1, 2, 3]);

Flight::destroy(collect([1, 2, 3]));

查询删除

$deletedRows = Flight::where('active', 0)->delete();

逻辑删除

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Flight extends Model
{
    use SoftDeletes; //多一个deleted_at字段
}

迁移文件

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Facades\Schema;

Schema::table('flights', function (Blueprint $table) {
    $table->softDeletes();
});

Schema::table('flights', function (Blueprint $table) {
    $table->dropSoftDeletes();
});

检查是是否被软删除

if ($flight->trashed()) {
    //
}

还原逻辑删除的数据

$flight->restore();
Flight::withTrashed()
        ->where('airline_id', 1)
        ->restore();
$flight->history()->restore();

强制物理删除

$flight->forceDelete();

和软删除的数据一起查询

$flights = Flight::withTrashed()
                ->where('account_id', 1)
                ->get();

只查询软删除的数据

$flights = Flight::onlyTrashed()
                ->where('airline_id', 1)
                ->get();

对象复制replicate

use App\Models\Address;

$shipping = Address::create([
    'type' => 'shipping',
    'line_1' => '123 Example Street',
    'city' => 'Victorville',
    'state' => 'CA',
    'postcode' => '90001',
]);

$billing = $shipping->replicate()->fill([
    'type' => 'billing'
]);

$billing->save();
Categories
php

PHP unit

测试用例例子

namespace Tests\Unit;


//use PHPUnit\Framework\TestCase;
//转换成Tests\TestCase 才能正确初始化laravel Application

use Tests\TestCase;

class ExampleTest extends TestCase
{

    //前置条件
     public function setUp()
    {
        parent::setUp();
    }

    /**
     * A basic test example.
     *
     * @return void
     */
    //测试的方法一定要test开头
    public function testBasicTest()
    {
        print "\n";
        echo("进入测试");
        $this->assertTrue(true);
    }
}

执行测试用例:


php vendor/phpunit/phpunit/phpunit ./tests/Unit/ExampleTest.php

查看命令情况:

php vendor/phpunit/phpunit/phpunit -h 
Categories
php

Laravel redis使用

laravel 使用redis 需要先安装redis包

composer require predis/predis

redis的配置文件是:config/database.php
 
 'redis' => [
 
        'client' => 'predis', //指定redis驱动为predis
 
        'default' => [
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD',null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 0,
        ],
 
    ],

在 .env 配置具体参数
REDIS_CLIENT=predis
    //也可在这里指定redis驱动为predis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
操作代码

use Illuminate\Support\Facades\Redis;

//set存数据 创建一个 key 并设置value 
Redis::set('key','value'); 
 
//get命令用于获取指定 key 的值,key不存在,返回null,如果key储存的值不是字符串类型,返回一个错误。
var_dump(Redis::get('key'));
 
//del 删除 成功删除返回 true, 失败则返回 false
Redis::del('key');
 
//mset存储多个 key 对应的 value
$array= array(
		'user1'=>'张三',
		'user2'=>'李四',
		'user3'=>'王五'
);
redis::mset($array); // 存储多个 key 对应的 value
 
// Mget返回所有(一个或多个)给定 key 的值,给定的 key 里面,key 不存在,这个 key 返回特殊值 nil
 
var_dump(redis::mget (array_keys( $array))); //获取多个key对应的value
 
//Strlen 命令用于获取指定 key 所储存的字符串值的长度。当 key存储不是字符串,返回错误。
var_dump(redis::strlen('key'));
 
//substr 获取第一到第三位字符
var_dump(Redis::substr('key',0,2));
 
//根据键名模糊搜索
var_dump(Redis::keys('use*'));//模糊搜索
 
//获取缓存时间
Redis::ttl('str2');//获取缓存时间
 
//exists检测是否存在某值
Redis::exists ( 'foo' ) ; //true

redis get

 'user' => Redis::get('user:profile:'.$id)

redis lrange

$values = Redis::lrange('names', 5, 10);

命令模式

$values = Redis::command('lrange', ['name', 5, 10]);

指定连接返回redis对象

$redis = Redis::connection('connection-name');

redis 事务


Redis::transaction(function ($redis) {
    $redis->incr('user_visits', 1);
    $redis->incr('total_visits', 1);
});

pipeline模式

Redis::pipeline(function ($pipe) {
    for ($i = 0; $i < 1000; $i++) {
        $pipe->set("key:$i", $i);
    }
});

redis消息队列(用laravel command 生成监听类)

消息订阅

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Redis;

class RedisSubscribe extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'redis:subscribe';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Subscribe to a Redis channel';

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        Redis::subscribe(['test-channel'], function ($message) {
            echo $message;
        });
    }
}

消息发布

 Redis::publish('test-channel', json_encode([
        'name' => 'Adam Wathan'
    ]));
Categories
php

carbon php 日期操作

laravel Eloquent 中自动把 datetime数据格式化为字符串 yyyy-MM-ddTHH:ii:ss:SSSSz

需要使用 Carbon::parse($value) 反序列化字符串为日期 再执行format(‘Y-M-d H:i:S’) 输出

Carbon 是 一个php的日期处理库

Categories
php

php 字符串操作

php 拼接

'/admin/doctors/'.strval($appointment->doctor->id)

. 连接字符串

php 字符串转换 转换为字符串

strval($appointment->doctor->id)

Categories
php

php 标准输出输入流

因为php默认的输入流就是请求 默认的输出流就是响应 当我们需要再控制台打印数据该如何办呢?

$fp = fopen("php://stdout", 'a');

fputs($fp, "hello\n");

有几个php://的流位php辅助的流

上图为控制台输出

php://stderr位控制台异常流

php://stdin为控制台输入流

Categories
php

Laravel-Admin

https://laravel-admin.org laravel-admin 文档

类似于ruby on rails (grails) laravel-admin 具有大量代码生成命令,(本身就是laravel的特性)代码区分 model controller view

然而view是由具体php类(继承自renderable)来定义的 高内聚 却 提高了门槛

这个是laravel-admin最大的特点舍弃了编辑html的机会(不用blade模板),用纯php代码书写视图(放弃了灵活性,但提高了效率,类似于extjs 用js把html封装成component对象 其渲染的核心方法也是render 接口是)

创建控制器 UserController 微控制器名称 –model指定数据库对象

php artisan admin:make UserController --model=App\User

初始化laravel-admin 会执行数据库初始化 并且 把laravel-admin的初始化文件 复制到 laravel下面

php artisan admin:install

自动生成 数据库表对象

php artisan make:model XXX

view组件:

Grid 的使用

  $grid = new Grid(new Appointment());

  $grid->model()->where('status', 1)->orderBy('created_at','desc');

Categories
php

php artisan

该命令是laravel下的项目命令

其实是用php执行项目下的artisan文件(php文件)

该文件会接受参数(通过$argv获取,$argc显示参数个数)

Categories
php

PHP 基础

PHP变量以$

字符串模板 : $temp = “Hello , {$var1} !”;

if语法:(注:是 elseif 不是else if)

if(true){

}elseif(false){

}else{

}

while语法:

while(true){ 

}

数组语法:

array(key=>value,key=>value)

[key=>value,key=>value]  //映射类数组

[value1,value2]  //顺序类数组

count($array) //返回数组长度

数组迭代:

foreach($array as $key => $value){

}

foreach ($array as $value){

}

函数:

function($variable){

return $value

}

模块: 通过require引入某个文件 通过use 引入命名空间

require “another.php”

use “/Robin/luo/Another”

类:

class Another {

public $property

public function __construct($property){

this->property = $property;

}

public function func($param){

return $value;

}

public static function func1(){

}

}

$object = new Another();

$object1 = new Another(1);

$object->property = 1;

$object->func(1);

Another::func1();

命名空间:通过namespace 定义 用\进行解析不是java的.

namespace Robin;

\Robin\luo::reading();