php laravel框架架中这个with函数怎么回事

1.whereDate() 方法
1 $q-&where('created_at', '&=', date('Y-m-d').' 00:00:00'));
以前查数据时,直接用where条件来比值判断,但是格式就会有严格的要求,如果上面的代码 第三个参数 是&date('Y-m-d') 而不加 后面的00:00:00 这样在数据库里面就会找不到
而判断是否相等 也都是对格式严格的要求
$q-&whereDate('created_at', '=', date('Y-m-d'));
现在用whereDate,laravel自带的方法,就会自动帮你进行日期格式处理,保证date与搜索的格式是匹配的。
$q-&whereDay('created_at', '=', date('d'));
$q-&whereMonth('created_at', '=', date('m'));
$q-&whereYear('created_at', '=', date('Y'));
例如上面的代码,只搜索天数为某值的时候,用whereDay,会去数据库里搜索某一天与其匹配的值。
2.wherePivot() 方法
一般这个方法的活动场景,模型中
class Company extends \Eloquent{...
public function memberApplies()
return $this-&belongsToMany('App\User', 'user_company_applies')
-&wherePivot('apply_status', UserCompanyApply::applyVerify)
-&wherePivot('type', UserCompanyApply::TYPE_USER);
wherePivot什么意思?,首先是company和user表,建立多关联的关系,关联表是user_company_applies
首先如果不加wherePivot,怎么显示
数据库这样
显示3条数据,
也就是从中间表里找company_id为1对应的user_id的数据,在把user_id的值带到user表里去查询有哪些数据,也就是这3条,这是原来的多对多的流程
现在加上了wherePivot方法,无非是加上一个判断条件,获得多对多的数据之后,再去查找中间表里的apply_status和type字段,查找2个都为1的数据是那条,有则显示
数据库现在改成这样
2个值都为1了,看能不能查询出 user_id为2525的这条数据
3. Carbon 类
Carbon是laravel处理时间类型的一个类。
1.&diffForHumans()方法
$article-&created_at-&diffForHumans();
diffForHumans方法,可以把日期转换成 &1 hours age&、&4 years&age& 这样的格式,同时,它还支持本地化,可以把其转换成中文形式的&1小时前&、&4年前&等。
可以在&app/Providers/AppServiceProvider.php&的&boot()&方法中添加下面的代码来设置全局本地化:
public function boot()
\Carbon\Carbon::setLocale('zh');
设置好之后,在输出时间的地方调用:
$article-&created_at-&diffForHumans();
输出的结果会是 查article表里created_at字段的值是多少,在统计现在时间和它相差多少,如果现在时间比值大18分钟,会显示&"18&minutes ago" 。
2. &diffInDays(),&diffInHours(),&diffInMinutes()
这几个方法都是差不多和Carbon一起使用的,例如
public function getCloseSignDayAttribute()
$day = Carbon::now()-&diffInDays($this-&close_time, false);
return $day & 0 ? $day : 0;
这个方法是在Lession模型中的,diffInDays就是统计,现在的时间和lession表里close_time字段的值之间相差多少时间。相差的时间以天的格式返回,例如数据库里是 现在时间是
返回的就是30天
carbon::now就是取当前时间的意思,加个diffInday统计相差时间,第一个参数$this-&close_time,是模型中close_time这个字段,模型就是去哪张表找,而这里close_time就从哪个字段找
下面看一下这个模型的$dates属性,官方文档有介绍
protected $dates = [
'start_time',
'close_time',
'created_at',
'updated_at'
大体意思dates里面填写的字段,会自动调整时间。&diffInHours(),&diffInMinutes() 方法就跟diffInDays()一个道理了,一个统计和&close_time相差多少小时,相差多少分钟,使用形式都是一样,返回值不同
$minute = Carbon::now()-&diffInMinutes($this-&close_time, false);
$minute返回相差多少分钟
3. addDay()方法
$less = Lesson::find(22);
$r = $less-&start_time-&addDay(2);
将start_time时间,增加2天,输出出来。
$arr = DB::table('archives')-&where('id',2)-&pluck('title');//获取一条数据的指定字段
$arr = DB::table('archives')-&where('id','&',1)-&lists('title');//获取一张表的一列字段
$arr = DB::table('archives')-&where('id','&',1)-&toSql();//获取查询的SQL语句,公用于条件,不能用于get()之类的有结果之中
阅读(...) 评论()宝剑锋从磨砺出,梅花香自苦寒来
ORM模型简介
1&什么是ORM?
ORM,即 Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在操作具体的 业务对象时,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法即可。
2&ORM 两种最常见的实现方式是 ActiveRecord 和 DataMapper,
ActiveRecord(非常流行) 中模型与数据表一一对应,
DataMapper 中模型与数据表是完全分离的。
3&Laravel 的 Eloquent ORM 使用 ActiveRecord 实现方式,每一个 Eloquent 模型类对应着数据库中的一张表,我们通过调用模型类的相应方法实现对数据库的增删改查。
4&由于 Eloquent 模型是查询构造器,你可在 Eloquent 查找中使用查询构造器的任何方法。
1 定义模型
1.1创建model模型
1.1.1 模型通常放在 app 目录中,也可以放在任何可通过 composer.json 自动加载的地方。(app文件夹下的内容会被自动加载,建议在app下建立models文件夹,)
1.1.2 所有的 Eloquent 模型都继承自 Illuminate\Database\Eloquent\Model 类。
1.1.3 模型约定,&针对&'flights'&数据表,模型类名为&'Flight',注意单复数。
1.1.4 创建模型实例的最简单方法是使用 make:model artisan命令
php artisan make:model Flight
创建模型的同时生成数据库迁移,
php artisan make:model UserAccount --migration //两个横线
php artisan make:model UserAccount -m //一个横线
1&使用大驼峰表示,模型名是单数形式,迁移文件中数据表名是蛇形复数,
2&以上例子中模型文件名和类名是 UserAccount.php ,
3&迁移文件名是_131759_create_user_accounts_table.php,迁移文件中使用的表名是 user_accounts
1.1.5 生成的文件位于app目录下,然后将文件移动到models文件夹下,再更改下命名空间
1.2模型约定
  主要是以下几个方面:表名,主键,时间,日期格式,数据库
class Flight extends Model {
* 与模型关联的数据表。
protected $table = 'flight';
* 指定主键。
public $primaryKey = 'id';
* 指定是否模型应该被戳记时间。
public $timestamps = false;
* 模型的日期字段保存格式。
protected $dateFormat = 'U';
* 此模型的连接名称。
protected $connection = 'connection-name';
分别解释上面的定义:
1&表名:除非数据表明确地指定了其它名称,否则将使用类的「蛇形名称」、复数形式名称来作为数据表的名称。例子中,Eloquent 将会假设 Flight 模型被存储记录在 flights 数据表中。
2&主键:默认,Eloquent 模型认为每张表主键为 id 。可以定义一个 $primaryKey 属性来重写。
3&时间戳:默认,Eloquent 会预计你的数据表中有 created_at 和 updated_at 字段。将 $timestamps 属性设置为 false,则不会自动维护这两个字段。
4&时间戳格式:在模型内设置 $dateFormat 属性。这个属性决定了日期应如何在数据库中存储,以及当模型被序列化成数组或 JSON 时的格式:
5&数据库连接:默认,会使用应用程序中默认的数据库连接设置。想为模型指定不同的连接,可以使用 $connection 属性:
2 添加模型(增)
2.1 基本添加,save方法
返回值:true或者false
//首先创建一个新模型实例
$flight = new F
//给这个模型添加属性
$flight-&name = $name;
$flight-&length = $length;
//... 其它更多属性
$flight-&save();
此时created_at 以及 updated_at 时间戳将会被自动设置
2.2 批量赋值,create方法
返回值:Eloquent 模型实例
批量赋值就是我们不必像前面那样一个个定义模型属性,我们可以传递一个数组给模型类(这个数组通常是表单)
$flight = Flight ::create(Input::all());
  这个方法有个前提条件,出于安全考虑,我们需要在model中设置黑名单(不可以被赋值的属性 protected $guarded = ['price'])或者白名单(可以被赋值的属性 protected $fillable = ['name']),如果不设置的话会报错
注意:如果设置了protected $guarded = ['price']
$input = [
'name'=&'test',   
'content'=&'testflight',   
'length'=&2000,   
// 'price'=&1880, 即使这里写了价格,因为是 受保护的,调用下面的create,也不会插入成功
$flight = Flight ::create($input);
//如果想成功,那么就重新定义一下属性,然后调用save方法
$flight -&price= 200;
$flight -&save();
2.3 如果想要批量插入数据
返回值:true或者false
//$data是可以是二维数组
Flight::insert($data)
2.4 另外两个方法
// 用属性取回航班,当结果不存在时创建它...
返回值是Eloquent 模型实例
$flight = App\Flight::firstOrCreate(['name' =& 'Flight 10']);
// 用属性取回航班,当结果不存在时实例化一个新实例,此时尚未存入数据库,可以使用save方法存储
$flight = App\Flight::firstOrNew(['name' =& 'Flight 10']);   
$flight-&save(); //存入到数据库
3 删除模型(删)
3.1 要删除模型,在模型实例上调用 delete 方法:
返回值是true或者false
$flight = App\Flight::find(1);   
//先从是数据库中取回数据   
$flight-&delete();
//实现删除
3.2 如果你知道模型的主键,可以不取回模型,直接删除
返回值是被删除记录数
App\Flight::destroy(1);   
App\Flight::destroy([1, 2, 3]);   
App\Flight::destroy(1, 2, 3);
3.3 通过查找来删除
返回值是删除条数
$deletedRows = App\Flight::where('active', 0)-&delete();
4 更新模型(改)
4.1 使用save方法
返回值:true或者false
$flight = App\Flight::find(1);   
$flight-&name = 'New Flight Name';   
$flight-&save();
4.2 使用update方法,同样要用到批量赋值(黑名单和白名单也起作用)
返回值:返回更新的条数
App\Flight::where('active', 1) -&where('destination', 'San Diego') -&update(['delayed' =& 1]);
5 取回模型(查)
5.1 取回多个模型
1& all方法会取回模型数据表中所有结果
$flights = Flight::all();
//我们遍历查找每个返回的flight实例,并且输出每个实例的name字段
foreach ($flights as $flight) {
echo $flight-&
2& 增加额外限制,使用get方法
$flights = App\Flight::where('active', 1) -&orderBy('name', 'desc') -&take(10) -&get();
//分块结果
Flight::chunk(200, function ($flights) {
foreach ($flights as $flight) {
  &1&all和get等方法返回一个 Illuminate\Database\Eloquent\Collection 实例,这个实例中包含多个Eloquent 模型,Collection 类提供多种辅助函数来处理 Eloquent 结果。我们也可以简单地像数组一样来遍历集合。
  &2&Eloquent 模型是查询构造器,因此你应当去阅读所有查询构造器中可用的方法。你可在 Eloquent 查找中使用这其中的任何方法。
5.2 取回单个模型
这些方法返回的是单个模型的实例,而不是返回模型的集合:
1& 通过主键取回一个模型,使用find方法
$flight = App\Flight::find(1);
2& 取回符合查找限制的第一个模型,使用first方法
$flight = App\Flight::where('active', 1)-&first();
//找不到抛出异常
$model = App\Flight::findOrFail(1);
$model = App\Flight::where('legs', '&', 100)-&firstOrFail();
5.3 其他一些连贯操作
使用 count、sum、max,和其它查询构造器提供的集合函数。这些方法会返回适当的标量值,而不是一个完整的模型实例:
$count = App\Flight::where('active', 1)-&count();
$max = App\Flight::where('active', 1)-&max('price');
阅读(...) 评论()共被编辑 2 次
找了一些下午,最后发现还是自己没有认真阅读理解laravel文档,这个问题属于多态关系,一下午就跳进这个坑了,至于怎么做去看laravel文档吧,我就不细说了。但是我这儿要分享一下我下午踩坑获得的体会与经验,对于多态关系,我百度了一下,几乎都和laravel文档里面给的例子差不多,没有一些详解,对于MorphTo()方法的参数没有说明,于是我查了下laravel api,英文不怎么好的我还是看懂了的:),MorphTo方法有三个参数:第一个是这个多态关系你要一个命名,不给就默认是方法名;第二个是自定义type类型,数据库表里那个代表类型的字段名,这个type字段的值是类名,例如:App\Photo(要加上App哦!);第三个参数就关联其他表的id的那个字段名;我还是粘一下代码帮助理解:
* 数据库字段是id,userId,dynamicRelationId,type
public function dynamicRelation(){
return $this-&morphTo('dynamicRelation', 'type', 'dynamicRelationId');
希望对大家有帮助!
找了一些下午,最后发现还是自己没有认真阅读理解laravel文档,这个问题属于多态关系,一下午就跳进这个坑了,至于怎么做去看laravel文档吧,我就不细说了。但是我这儿要分享一下我下午踩坑获得的体会与经验,对于多态关系,我百度了一下,几乎都和laravel文档里面给的例子差不多,没有一些详解,对于MorphTo()方法的参数没有说明,于是我查了下laravel api,英文不怎么好的我还是看懂了的:),MorphTo方法有三个参数:第一个是这个多态关系你要一个命名,不给就默认是方法名;第二个是自定义type类型,数据库表里那个代表类型的字段名,这个type字段的值是类名,例如:AppPhoto(要加上App哦!);第三个参数就关联其他表的id的那个字段名;我还是粘一下代码帮助理解:
* 数据库字段是id,userId,dynamicRelationId,type
public function dynamicRelation(){
return $this-&morphTo('dynamicRelation', 'type', 'dynamicRelationId');
希望对大家有帮助!
我要该,理由是:

我要回帖

更多关于 php laravel框架 的文章

 

随机推荐