找单个模型 / 统计

自然,除了可打表中检索出有的记录之外,你也可行使 findfirst
方法来打数据库中找出只有条之数额。这将见面回到一个独立的模子实例:

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

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

你为堪下 find
方法时传递一个富含主键所做的一再组,这将回到所有匹配到记录的集纳:

$flights = App\Flight::find([1, 2, 3]);

勿察觉时之怪

偶然,你或想于没有找到匹配的模子时抛来一个不胜。这对路由或者控制器来说尤其有因此。findOrFail
firstOrFail
方法可以打询问中找找出首独相当的结果,但是,如果结果负绝非匹配的起,那么会丢弃来一个
Illuminate\Database\Eloquent\ModelNotFoundException 异常:

$model = App\Flight::findOrFail(1);

$model = App\Flight::where('legs', '>', 100)->firstOrFail();

若果生没有给抓获,那么会一直传送给用户一个 404 HTTP
响应。所以当您于应用这些方法时凡从未有过必要编写明确的自我批评并回 404
响应的:

Route::get('/api/flights/{id}', function ($id) {
  return App\Flight::findOrFail($id); 
});

当,Windows 中吗不乏像 @風烨漾 一样的黑色背景用户:

查询软删除的范

含软删除的范

纵使如上面我们所关联的,被软删除的型将自动的打结果吃进行去。事实上,你得运用
withTrashed 方法来强制结果中显就被软删除的范:

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

whitTrashed 方法吗足以在涉及查询中展开利用:

$flight->history()->withTrashed()->get();

徒摸被软删除的型

onlyTrashed 方法会从数据库中检索被软删除的范记录:

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

回复被软删除的模型

有时候你或许会见愿意恢复已经为软删除的范,你可以采用 restore
方法来以模型从软删除中祛:

$flight->restore();

你吗可以当查询中应用 restore 方法来飞的还开多单模型:

App\Flight::withTrashed()
  ->where('airline_id', 1)
  ->restore();

就像 withTrashed 方法一致,restore 方法也堪当论及查询中行使:

$flight->history()->restore();

永恒的去除模型

有时你或要由数据库被直接删除这个模型。你可采用 forceDelete
方法来以模型从数据库被永远的去除:

// Force deleting a single model instance...
$flight->forceDelete();

// Force deleting all related modls...
$flight->history()->forceDelete();

4nZPdmBoVE4fkpSDntf0c4zgDRE3yH9v4gvYOd4R.png

询问区间

连片下去,我们快来看望本期沸点有什么精彩回答吧。

简介

Laravel 的 Eloquent ORM
提供了扳平栽名特新优精简洁的涉及映射的模型来与数据库进行交互。所有的多寡库表都发出对应的型,这些模型被用来和申进行相互。模型允许你直接查询数据库表中之数,及插入新的记录到数码表中。

在初步前,你要保证完成了 config/database.php
配置文件中的数据库配置。对于再次多的配备数据库相关的音,请参考
文档。

当对着为数不多的 Windows
用户,并且还是采用白色背景的编辑器,稀土君也决然要享受给大家省:

当下距离

时下距离允许而以范中定义有方可复用的常用的格。比如,你恐怕时时索要寻找一些为欢迎的用户。你得略的以范方法中前置
scope 命名来定义一个区间.

间隔应该总是回到一个询问生成器的实例:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
  /**
   * Scope a query to only include popular users.
   *
   * @return \Illuminate\Database\Eloquent\Builder
   */
   public function scopePopular($query)
   {
     return $query->where('votes', '>', 100);
   }

   /**
    * Scope a query to only include active users.
    *
    * @return \Illuminate\Database\Eloquent\Builder
    */
    public function scopePopular($query)
    {
      return $query->where('votes', '>', 100);
    }

    /**
     * Scope a query to only include active users.
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
     public function scopeActive($query)
     {
       return $query->where('active', 1);
     }
}

下区间查询

倘区间进行了定义,你可于范进行询问时调用区间方法,事实上,你当调用区间方法时并不需要包含
scope 前缝。你居然可以链式的调用其它的间隔:

$users = App\User::popular()->active()->orderBy('created_at')->get();

动态区间

偶然你可能希望定义一个可以接收参数的间隔。在初步前,你仅仅只有需要在公的区间中上加有额外的参数。区间参数应该在
$query 参数后展开定义:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
  /**
   * Scope a query to only include users of a given type.
   *
   * @return \Illuminate\Database\Eloquent\Builder
   */
   public function scopeOfType($query, $type)
   {
     return $query->where('type', $type);
   }
}

现,你得以调用区间时传递一些参数了:

$users = App\User::ofType('admin')->get();

此外,在白色背景用户被,Linux 用户 @毛了个线 也是光是一个,熟悉 Ubuntu
文本编辑器界面,也引起起了稀土君的有忆:

概念模型

每当始发前,让我们先行来创造一个 Eloquent 模型。模型通常存放在 app
目录下,但是你吗得以肆意之放于另外地方,只要其能够冲你的
composer.json 文件之指开展机动的加载。所有的 Eloquent 模型都持续自
Illuminate\Database\Eloquent\Model 类。

最简易的始建一个模型类的主意尽管是应用 make:model Artisan 命令:

php artisan make:model User

假若您愿意以你变模型的又非常成一份数据库迁移,你可行使 --migration
或者 -m 选项:

php artisan make:model User --migration

php artisan make:model User -m

Screen Shot 2016-06-20 at 4.55.27 PM.png

栽 & 更新模型

本次掘金沸点活动受到,根据稀土君的免全统计,在所有图片评论中,Mac 用户
58 个,Windows 用户10 个,Linux 用户 2 个,另外,居然还有同位 Android
用户!快来看望具体的图样统计:

基础插入

顾念如果在数据库被插新的笔录,只待简单的缔造模型实例,然后设置模型的习性,再调用
save 方法就是好了:

<?php

namespace App\Http\Controllers;

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

class FlightController extends Controller
{
  /**
   * Create a new flight instance.
   *
   * @param Request $request
   * @return Response
   */
   public function store(Request $request)
   {
     // Validate the request...

     $flight = new Flight;

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

     $flight->save();
   }
}

每当是例子中,我们简要的起流入的 HTTP 请求中之 name 参数分配到
App\Flight 模型实例的 name 属性上。当我们调用 save
方法时,这漫长记下将会晤插入到数据库被,同时 created_atupdated_at
时间戳也会自动的给进行安装,所以就并不需要进行手动的装它们。

「[掘金·
沸点][2]」是[掘金社区][3]的一个新栏目。一直以来,用户来到掘金和以掘金都是为着看优质的内容,这一点为是咱会坚持的。

但是,掘金的愿景并不仅是做成一个阅读器。我们期待掘金是一个发出温的出品。从「沸点」的讳大家就可以看出我们针对是版块的定点,我们想大家好当此处刊登意见,就像一个高喊的茶坊或者酒楼。这里可以产生高谈阔论,有锐利的合计,也得以仅说三言两语,说只段落抖个灵动,只要好好,便会有人为卿沾赞。

事件

Eloquent 模型可以触发又波,这允许而以范的生命周期的依次重要点进行
hook 操作。你可以使下的法子进行
Hook:creatingcreatedupdatingupdatedsavingsaveddeletingdeletedrestoringrestored。事件允许而轻松的在模型进行仓储或更新操作时开展实践额外的操作。

一眼看出 @代码妹
的对,稀土君想啊卿点个赞。是呀,不管是什么配色,完的成工作就是好配色。

基本功因此法

当一个初的模子首次于进行仓储操作时,会触发 creatingcreated
事件。如果模型都存在被数据库被,并且调用 save 方法,那么 updating
/ updated 事件将会见叫触发。事实上,在马上有限栽状态下,savingsaved
事件都见面为硌。

举个示例,让咱们当劳动提供者中定义一个 Eloquent
事件监听器。在咱们的轩然大波监听器中,我们以在给定的模型中调用 isValid
方法,当型并没经过验证时将回来 false。如果从 Eloquent
事件监听器中归 false,那么用吊销 save / update 操作:

<?php

namespace App\Providers;

use App\User;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
  /**
   * Bootstrap any application services.
   *
   * @return void
   */
   public function boot()
   {
     User::creating(function ($user) {
       if (! $user->isValid()) {
         return false;
       }
     });
   }

   /**
    * Register the service provider.
    *
    * @return void
    */
    public function register()
    {
      //
    }
}

阴明大大的编辑器是怎的,相信你们一定会怀念知道吧。

剔除模型

乃可于范实例中使 delete 方法来删除模型:

$flight = App\Flight::find(1);

$flight->delete();

根据键删除存在的模型

于方的事例中,我们先行由数据库被找找出有关的范,然后才调用 delete
方法来进行去。事实上,如果你懂了型的主键,那么您完全可以不用失去搜寻到它。你得一直下
destroy 方法来进行删除:

App\Flight::destroy(1);

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

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

通过询问删除模型

自,你啊得透过询问删除一个模子集。在是事例中,我们拿去所有标记为不启用的航班:

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

好了,本次掘金沸点的总结到此就是得了了,老样子,新一企的沸点话题《你常用之
Chrome
插件有哪些?》正在如火如荼进行,如果你吗想与届我们的沸点活动,赶快点击这里走访掘金参与吧。

大局区间

全局区间允许你在加的模子上之兼具查询进行封锁的长。Laravel
自己之软删除功能就是运了大局区间来打数据库被拉取未去的多少。编写好之全局区间可以好的指向加模型的享有查询进行封锁。

编排全局区间

编辑一个大局区间非常简单,你就需要定义一个贯彻了
Illuminate\Database\Eloquent\Scope
接口的切近。这个接口就要求你兑现一个办法:applyapply
方法可当得的时加加 where 约束:

<?Php

namespace App\Scopes;

use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class AgeScope implements Scope
{
  /**
   * Apply the scope to a given Eloquent query builder.
   *
   * @param \Illuminate\Database\Eloquent\Builder $builder
   * @param \Illuminate\Database\Eloquent\Model $model
   * @return void
   */
   public function apply(Builder $builder, Model $model)
   {
     return $builder->where('age', '>', 200);
   }
}

Laravel 没有也距离预置存放的目录,所以若可无限制之创造自己的 Scopes
目录来进展管制。

采用全局区间

而得在给定的模型中复写 boot 方法以采取 addGlobalScope
方法来分配全局区间:

<?php

namespace App;

use App\Scopes\AgeScope;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
  /**
   * The "booting" method of the model
   *
   * @return void
   */
   protected static function boot()
   {
     paraent::boot();

     static::addGlobalScope(new AgeScope);
   }
}

于增长了区间后,调用 User::all() 的查询会起下述的 SQL:

select * from `users` where `age` > 200

匿名全局区间

Eloquent
也同意而通过一个闭包来定义全局区间,这便对非需分离及独门一个看似公事被的简要区间越有效:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class User extends Model
{
  /**
   * The "booting" method of the model.
   *
   * @return void
   */
   protected static function boot()
   {
     parent::boot();

     static::addGlobalScope('age', function (Builder $builder) {
       $builder->where('age', '>', 200);
     });
   }
}

传递到 addGlobalScope()
方法的首单参数将当距离的绝无仅有标识,你得经标识将其铲除:

User::withoutGlobalScope('age')->get();

去全局区间

如果你望由给定的询问中移除全局区间,你可利用 withoutGlobalScope
方法:

User::withoutGlobalScope(AgeScope::class)->get();

设若您想去多单或全部之全局区间,你可行使这样使用
withoutGlobalScopes 方法:

User::withoutGlobalScopes()->get();

User::withoutGlobalScopes([FirstScope::class, SecondScope::class])->get();

除上述两各项用户,回答里还发出平等各奇葩用户,看到评论里来 Android
用户,稀土君真的凡藉了千篇一律杀震:

追寻统计

自,你可以使用 countsummax 和其他
查询生成器
所提供的之
聚合函数。这些方法会返回适当的数值,而休是共同体的模型实例:

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

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

Windows White.jpg

软删除

而外由数据库中真正的去数据外,Eloquent
也足以进行软删除操作。当型是一个软删除模型时,它们并无见面真的的于数据库中革除记录。实际上,它们会以模型的
deleted_at 属性进行安装,并且将其履新至数据库中。如果模型中的
deleted_at 的价不是
NULL,那么其就是为记为软删除了。如果您需要启用软删除模型,你要在模型中引入
Illuminate\Database\Eloquent\SoftDeletes trait,并且于模型的 $dates
属性中上加 deleted_at 列:

<?php

namespace App;

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

class Flight extends Model
{
  use SoftDeletes;

  /**
   * The attributes that should be mutated to dates.
   *
   * @var array
   */
   protected $dates = ['deleted_at'];
}

理所当然,你应该在数据表中补充加 deleted_at 列。Laravel 的
组织生成器
中提供了挺成该列的点子:

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

现在,当我们调用 delete 方法时,deleted_at
列会于装置为眼前岁月。并且,当查问启用软删除的范时,已经让软删除的模型将活动从结果受到除去。

你可以使 trashed 方法来判定所加的范是否已被软删除:

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

终极,稀土君想引用一下 @agileago1465703838000
的答案问问大家,你道什么编辑器的体制好看与否?

Eloquent 模型约定

如今,让咱们来拘禁一个 Flight 模型的言传身教,我们将由此它们赢得与存储数据库中
flights 表的数额:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
  //
}

表名称

汝要留意我们地方的代码中连无指出 Flight
模型使用谁数据库的表明。如果您未曾强烈的指出模型所对应之表,那么
Eloquent
将祭类的蛇形命名的复数形式来以相应的数据表。所以,在这个事例中,Eloquent
将会要 Flight 模型存储的笔录受放在 flights 表中。你可以使
table 属性来指定表名:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
  /**
   * The table associated with the model.
   *
   * @var string
   */
   protected $table = 'my_flights';
}

主键

Eloquent 也会见要所有表的主键列名为 id。你吗只是运 $primaryKey
属性来手动的指定表的主键。

除此以外,Eloquent
也会如主键是一个自增的整型值,这意味,在默认情况下主键会叫电动的转为
int。如果你愿意用非自增或者非数字的主键,那么您待在模型中将公开的
$incrementing 属性设置也 false

时间戳

默认的,Eloquent 期望模型表中存在 created_atupdated_at
列,如果您免希望 Eloquent 自主的军事管制就点儿排,你得于范中设置
$timestamps 属性为 false:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
  /**
   * Indicates if the model should be timestamped.
   *
   * @var bool
   */
   public $timestamps = false;
}

要是您要从定义时间穿的格式,你得设置 $dateFormat
属性。这个特性用来支配日期属性存储于数据库中之格式,以及模型在进展排化为数组或者
JSON 时的展示样式:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
  /**
   * The storage format of the model's date columns.
   *
   * @var string
   */
   protected $dateFormat = 'U';
}

数据库连接

默认的,所有的 Eloquent
模型都见面使用使用配置的默认的数据库连接。如果您盼模型使用不同的数据库连接,你可利用
$connection 属性:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
  /**
   * The connection name for the model.
   *
   * @var string
   */
   protected $connection = 'connection-name';
}

Black.png

搜索多个模型

若果你创造了范与其对应的数据表,你便也从数据库被觅数据做好了准备。你可以将
Eloquent
模型作一个强硬的查询生成器来采取,它同意通过模型流畅的查询相应的表中的数。比如:

<?php

namespace App\Http\Controllers;

use App\Flight;
use App\Http\Controllers\Controller;

class FlightController extends Controller
{
  /**
   * Show a list of all available flights.
   *
   * @return Response
   */
  public function index()
  {
    $flights = Flight::all();

    return view('flight.index', ['flights' => $flights]);
  }
}

访列的值

假定你得了 Eloquent
模型的实例,那么您可经模型中相应的列名的性质来访问表中列的价。比如,让咱循环查询的结果,并通过取得之
Flight 实例来得到 name 列的值:

foreach ($flights as $flight) {
  echo $flight->name;
}

填补加额外的基准

Eloquent 的 all 方法会返回模型表中所有的笔录。由于拥有的 Eloquent
模型都足以看做查询生成器来开展服务,所以你可以在这些查询中益额外的条件,然后利用
get 方法来探寻结果:

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

在意:由于 Eloquent
模型呢是询问生成器,所以你可以回想一下查询生成器中具有可用之法门,因为它们等同可以
Eloquent 中进行利用。

集合

对于像 allget 这样的 Eloquent 方法会返回多独结果,这将赶回一个
Illuminate\Database\Eloquent\Collection 实例。Collection
类提供了各种有效之措施与 Eloquent
结果开展交互。当然,你可以简单的针对性聚集进行巡回,因为他贯彻了 ArrayAccess
接口:

foreach ($flights as $flight) {
  echo $flight->name;
}

本着结果开展分块

比方你要处理数千长长的 Eloquent 记录,那么您可采取 chunk 方法。chunk
方法会从 Eloquent 模型中找寻出同样有点片记录,然后拿其传递让 Closure
进行处理。使用 chunk 方法在拍卖大量结出集时可有立竿见影之跌内存的损耗:

Flight::chunk(200, function ($flights) {
  foreach ($flights as $flight) {
    //
  } 
});

传递及方法的第一只参数是您而安装进行分块的轻重缓急。而传递至第二个参数的闭包将会晤在从数据库检索出各个块内容常常开展调用。

640.jpg

批量赋值

乃吧足以利用 create
方法来当一行中贮存一个初的模子。一个激增的型实例将会自法被回到。事实上,在开班做这些之前,你得先指定模型的
fillable 或者 guarded 属性,它们是针对性批量赋值时之保护措施。

当用户通过 HTTP
请求传递一些意想不到之参数时,这或会见招致批量赋值时有问题之产出,或许参数中存在一些您并无思改变的列值的参数。比如,一个黑心之用户或会见当伸手中放到一个
is_admin 参数,然后这些参数映射到您的 create
方法被,这就使用户以自己升级为超级管理员。

故而,在开始之前,你要事先定义哪些模型属性是得开展批量分配的。你得下模型
$fillable 属性,让我们在 Flight 模型中上加允许 name
属性的批量赋值:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Dlight extends Model
{
  /**
   * The attributes that are mass assignable.
   *
   * @var array
   */
   protected $fillable = ['name'];
}

若我们只要一个特性可以开展批量赋值。那么我们得动用 create
方法直接的丰富记录及数量遭到。create 方法会返回存储后底模子实例:

$flight = App\Flight::create(['name' => 'Flight 10']);

$fillable 就如是啊批量赋值提供了扳平栽白名单的体制。你吗可以选采取
$guarded$guarded
属性应该包含一个若无思只要进行批量赋值的性能所组成的数组。所有未以斯数组中之性都拿好展开批量赋值。所以,$guarded
就如一个黑名单的效果。当然,你该就以 $fillable 或者 $guarded
中的一个,而未是合:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
  /**
   * The attributes that aren't mass assignable.
   *
   * @var array
   */
   protected $guarded = ['price'];
}

每当点的事例中,除了 price,所有的习性都得以展开批量赋值。

其余创建方法

此间也闹另两种方法好运用批量赋值进行模型的创造:firstOrCreate
firstOrNewfirstOrCreate
方法会尝试根据加的排列的键值对由数据库定位有关的模子。如果有关的模子没有找到,那么会根据加的性在数据库中初添一修记下。

firstOrNew 方法和 firstOrCreate
方法同样,但是其当范没有找到时才会返回一个新的模型实例,并无会见于数据库中初长一长记下。你得手动的利用
save 方法来以那个储存到数据库被:

// Retrieve the flight by the attributes, or create it if it doesn't exists...
$flight = App\Flight::firstOrCreate(['name' => 'Flight 10']);

// Retrieve the flight by the attributes, or instantiate a new instance...
$flight = App\Flight::firstOrNew(['name' => 'Flight 10']);

尽管言辞是如此说,相信你们一定非常想清楚稀土团队的诸位开发的编辑器都是怎么的吧,不如一起来探视吧~

基础的创新

save
方法为可用来更新数据库中早已在的数据模型。为了创新模型,你应该首先检索到它们,然后设置任何你想如果创新的特性,接着调用
save 方法。这一次,updated_at
时间戳会自动的拓展翻新,所以若并不需要手动的换代是价:

$flight = App\Flight::find(1);

$flight->name = 'New Flight Name';

$flight->save();

你呢得以对查询匹配的大多独模型进行创新操作。比如,所有 active 并且
destinationSan Diego 的航班将见面吃标记为延迟:

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

update 方法接收一个怀念使更新的排的键值对数组。

Screen Shot 2016-06-20 at 4.22.57 PM.png

Eloquent: 起步

基于我司 iOS 开发编辑器来拘禁,他自然是一个二次元~

tech .png

Screen Shot 2016-06-20 at 5.46.18 PM.png

第十一要《晒一晾而的编辑器配色吧》沸点活动中,稀土君同豪门共聊了权各自在开发过程中所采取的编辑器窗口的配色,真可谓是跟着「甜粽子和咸粽子」、「甜豆腐脑和咸豆腐脑」大战之后的而一个两大阵营的对决,这里面藏着的,不光是黑白背景的征,更是操作系统中的纷争……

Screen Shot 2016-06-20 at 4.49.50 PM.png

Screen Shot 2016-06-20 at 3.00.02 PM.png

Screen Shot 2016-06-20 at 4.24.57 PM.png

首先布置照片,当然是缘于稀土君的自曝,你想不思明白稀土君的编辑器配色?