Eloquent ORM cheatsheet

Eloquent ORM cheatsheet

Defining model in Laravel

<?php
 
namespace App\Models;
 
use Illuminate\Database\Eloquent\Model;
 
class User extends Model {
}

Overide default database table name

(1)前面我们并没有告诉 User 模型会使用哪个数据库表。此时系统会默认自动对应名称为「类名称的小写复数形态」的数据库表。所以,在上面的例子中, Eloquent 会假设 User 模型将把数据存在 users 数据库表。
(2)我们也可以在模型中定义 $table 属性来指定自定义的表名:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
 
class User extends Model {
  /**
     * 关联到模型的数据表
     * @var string
     */
    protected $table = 'my_users';
}

Overide default database table primary key

Eloquent 默认每张表的主键名为 id,我们可以在模型中定义 $primaryKey 属性来指定其他的字段:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;

class User extends Model {
  /**
     * 指定主键字段
     * @var string
     */
    protected $primaryKey = 'uid';
}

Time stamps 时间戳

(1)默认情况下,Laravel 会认为你的表中自带有 created_at 和 updated_at 这两个字段,并会在生成数据的时候自动填充。
(2)如果我们的表中没有这两个字段或者不想自动管理它们,可以将其关掉:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
 
class User extends Model {

  public $timestamps = false;
}

(3)我们还可以修改时间戳在数据库中的存储格式(默认从年存到秒),还有从数据库中读出来的显示格式:
(具体时间格式有哪些可以参考 PHP 官方手册:https://www.php.net/manual/en/datetime.createfromformat.php)
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
 
class User extends Model {
  // 时间戳格式化形式
  protected $dateFormat = 'U';
}

指定数据库连接

默认情况下,所有的 Eloquent 模型使用应用配置中的默认数据库连接。如果我们想要为模型指定不同的连接,可以通过 $connection 属性来设置(当然,这个数据库也必须事先在 config 里面配置过):
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
 
class User extends Model {
  // 指定这个模型对应的数据库连接
  protected $connection = 'mongodb';
}

获取模型数据

(1)获取所有数据
我们使用 all() 方法可以把全部记录取出来,也就是自动把对应的模型对象集合全部取出来。
$users = User::all();
 
//foreach ($users as $user) {
//    echo $user->username;
//}

(2)使用 find() 方法可以根据主键取出一条数据。
$user = User::find(2);

(3)find() 方法还可以用于查询多条记录,传入一个数组即可:
$users = User::find([1,2,3]);

(4)使用 find() 方法可以从结果集中取第一个记录:
$user = User::all()->first();

(5) 添加约束条件查询数据
(a)由于每一个 Eloquent 模型都是一个查询构建器,我们还可以添加约束条件到查询,然后使用 get 方法获取对应结果。
$users = User::where('id', '>', 1)
               ->orderBy('username', 'desc')
               ->take(10)
               ->get();
(b)如果没法使用 Eloquent 提供的约束接口产生出查询语句,也可以使用 whereRaw 方法来编写原生的 sql 语句:
$users = User::whereRaw('id > ? and username like \'%hang%\'', [0])
              ->get();

(6) 切片化处理结果plunk()
如果我们需要处理数据量很大的 Eloquent 结果集,可以使用 chunk 方法。chunk 方法会获取一个指定数量的 Eloquent 模型“组块”,并将其填充到给定闭包进行处理,从而有效减少内存消耗。chunk 方法第一个参数表示每次“拆分”要取出的数据数量。第二个参数的闭合函数会在每次取出数据时被调用。
// 每次查询200条
User::chunk(200, function ($users) {
    foreach ($users as $user) {
        //
    }
});

(7) cursor()
cursor 方法允许我们使用游标迭代处理数据库记录,一次只执行单个查询。在处理大批量数据时,cursor 方法可大幅减少内存消耗。
foreach (User::where('id', '>', 0)->cursor() as $user) {
    echo $user;
}

(8) aggregation
我们可以使用查询构建器提供的聚合方法( count、sum、min、max、avg 等),以及其它查询构建器提供的聚合函数。这些方法返回计算后的结果而不是整个模型实例。
$count = User::where('id', '>', 1)->count();
$max = User::where('id', '>', 1)->max('age');

Query Scopes /范围查询

(1)范围查询可以让我们轻松的重复利用模型的查询逻辑。要设定范围查询,只要定义有 scope 前缀的模型方法:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model {
  // 只查询老年用户
  public function scopeOld($query)
  {
    return $query->where('age', '>=', 60);
  }
   
  // 只查询女性用户
  public function scopeWomen($query)
  {
    return $query->where('sex', 0);
  }
}

(2)下面是使用范围查询的使用(调用时不需要加上 scope 前缀)。注意:范围查询同样支持链式调用。
$users1 = User::women()->get();
$users2 = User::women()->old()->orderBy('id', 'desc')->get();

(3) dynamic scope query/ with parameters
(a)有时我们可能想要定义可接受参数的范围查询方法,只要把参数加到方法里:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model {
  public function scopeOfAge($query, $age)
  {
    return $query->where('age', $age);
  }
}
(b)使用时把参数值传到范围查询方法调用里即可:
$users = User::ofAge(88)->get();

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

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

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.