php -S localhost:8000 -t xiaohu/public --
S
是指server
,测试用的,t
指定入口文件在哪里
封装函数
// 获取传递的参数
function rq($key=null,$default=null)
{
if (!$key) return \Request::all();
return \Request::get($key,$default);
}
// 分页 第几页和每页多少条数据
function paginate($page=1,$limit=16)
{
$limit = $limit ?:16;
$skip = ($page ? ($page-1) :0 ) * $limit;
return [$limit,$skip];
}
// 错误信息
function err($msg = null)
{
return ['status'=>0,'msg'=>$msg];
}
// 正确的信息 参数是一个数组
function suc($data_to_merge = [])
{
$data = ['status'=>1,'data'=>[] ];
if ($data_to_merge)
<!-- 让新数据he和$data['data']合并 -->
$data['data'] = array_merge($data['data'],$data_to_merge);
return $data;
}
/*
* 获取用户信息api
*/
public function read()
{
if (!rq('id'))
return err('id required');
$get = ['id','username','avatar_url','intro'];
// $this->get($get); //取到的值是带有$get字段的所有数据
$user = $this->find(rq('id'),$get); // 的得到的是id=rq('id')的数据,取值是$get数组内的数据
dd($user->toArray());
$user = $this->find(rq('id'),$get);
$answer_count = $user->answers()->get()->toArray();
dd($answer_count );
这个时候得到的是answer表和answer_user表合并的数据
}
Migration
创建表
php artisan make:migration create_table_answers --create=answers
修改表名
Schema::rename('table1','table_1');
php artisan migrate --pretend --预览要生成的sql语句
php artisan migrate //生成table
php artisan make:migration create_table_users --create=users
Request::has('age'); //返回类型是bool值
Request:get('age'); //有则返回值,没有则返回null
$table->unsignedInteger('user_id'); //int(10)不为负数
$table->foreign('user_id')->references('id')->on('users'); //添加外键
设置唯一索引,可以写单个字段,也可以写在一个数组里面
$table->unique(['user_id','answer_id','vote']);
投票表里面,一个用户只能给一个问题,投一个票,所以这三个参数都可以设置唯一索引
public function up()
{
Schema::create('answer_user', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('user_id');
$table->unsignedInteger('answer_id');
$table->unsignedSmallInteger('vote');
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users');
$table->foreign('answer_id')->references('id')->on('answers');
$table->unique(['user_id','answer_id','vote']);
});
}
组合数组建立的唯一索引,是整个数组唯一,并不是某个字段唯一。比如,这三个字段的值分别是1,2,3.其他数据的值只要不是这组数据即可
数据库操作问题
where里面可以是key,value形式,也可以是数组的形式。但是数组的形式可以存放多个条件
$this->where(['question_id'=>rq('question_id'),'user_id'=>session('user_id')])->count();
//获取传过来的数据,如果键存在,则取对应的值,否则取全值
function rq($key=null,$default=null)
{
if (!$key) return \Request::all();
return \Request::get($key,$default);
}
检查是否登录
public function is_logged_in()
{
return session('user_id') ? :false;
}
下面两句话是相等的,都是hash加密
$hashed_password = Hash::make($password);
$hashed_password = bcrypt($password);
检验连个hash值是否相同 check
Hash::check(rq('old_password'),$user->password)
$this->save()
比其他插入方式的优势在于,这种方法即使有不能为空的字段,他能做相当于更新的操作。自动赋默认值
有时候使用外键在插入数据的时候可能会出现1452的问题,暂时还不知道怎么解决。但是删除外键就可以了
多对多的关联模型
newPivotStatement() 此方法可以使我们操作关联的数据库
查看问题的api
public function read()
{
// 请求参数中国是否有id,有则返回id所在的行
if (rq('id'))
return ['status'=>1,'data'=>$this->find(rq('id'))];
// limit条件
$limit= rq('limit')?:15;
// skip条件 用于分页
$skip = ( rq('page') ? rq('page')-1 : 0 ) * $limit;
// 构建query并返回collection数据
$r = $this
->orderBy('created_at')
->limit($limit)
->skip($skip)
->get(['id','title'])
->keyBy('id');
return ['status'=>1,'data'=>$r];
}
$limit = $limit ?:16; 这个限制条件为真(或者存在值),就使用当前值;没有值ze则默认使用16
关联模型
class User extends Model
{
/**
* 获取与用户关联的电话号码
*/
public function phone()
{
return $this->hasOne('App\Phone');
}
}
第一个传到 hasOne 方法里的参数是关联模型的类名。一旦定义好两者之间关联,我们就可以通过使用 Eloquent 的动态属性来获取关联纪录。
动态属性允许你访问关联函数,如同他们是定义在模型中的属性
$phone = User::find(1)->phone;
当然,因为所有的关联也都提供了查询语句构造器的功能,因此你可以对获取到的评论进一步增加条件,
通过调用 comments 方法然后在该方法后面链式调用查询条件:
$comments = App\Post::find(1)->comments()->where('title', 'foo')->first();
$vote_ins = $answer->users()
->newPivotStatement()
->where('user_id',session('user_id'))
->where('answer_id',rq('id'))
->get();
dd($vote_ins);
上面代码得到的是 answer_user 表里面的数据,得到的是一维数组 get()[0]->vote;
如果没有 newPivotStatement() 得到的是answer和user表合并的数据,得到的是一个集合
get()[0]->username;
$answer->users() 得到的是answer表和users表的关联模型
newPivotStatement() 得到的是answer_user 表的模型
$answer
->users()
->attach(session('user_id'));
这个时候得到的是answer_user表里面的数据,指定了user_id
当涉及到删除带有外键索引的数据时
当涉及到删除带有外键索引的数据时,要先删除外键关联的书记,然后再删除ben tiao本条数据
先删除此评论下的所有回复
$this->where('replay_to',rq('id'))->delete();
再删除本评论
return $comments->remove() ? ['status'=>1]: ['status'=>0,'db delete failed'];
通用
api
,我们每个model
内的方法一般都仅限于本model
内;通用api
要you有跨表查询的功能。多对多关系,两个表之间要建立一个连接表。连接表的表名不需要是复数
取随机数 rand(1000,9999);