本文目录一览:
- 1、如何在 ThinkPHP 中整合 Laravel Eloquent ORM
- 2、PHP框架 Laravel Eloquent ORM 批量插入数据,怎么实现
- 3、Laravel Eloquent save 触发了哪些事件
- 4、php eloquent 怎么安装orm
如何在 ThinkPHP 中整合 Laravel Eloquent ORM
安装 illuminate/database根据自己使用的 PHP 版本,通过 composer 安装对应的 illuminate/database 版本,例如
composer require illuminate/database:5.3.*
接入到 TP 中
在 ThinkPHPLibraryThinkThink.class.php 文件中的 start方法的最后一行的 App::run(); 上方添加如下代码:
$capsule = new \Illuminate\Database\Capsule\Manager;
$capsule-addConnection([
'driver' = C('DB_TYPE'),
'host' = C('DB_HOST'),
'database' = C('DB_NAME'),
'username' = C('DB_USER'),
'password' = C('DB_PWD'),
'charset' = C('DB_CHARSET'),
'collation' = C('DB_COLLATION'),
'prefix' = C('DB_PREFIX'),
]);
$capsule-setAsGlobal();
$capsule-bootEloquent();
解决 E 方法冲突 illuminate/database 的 vendorilluminatesupporthelpers.php 方法中存在一个方法
/**
* Escape HTML special characters in a string.
*
* @param \Illuminate\Contracts\Support\Htmlable|string $value
* @return string
*/
function e($value)
{
if ($value instanceof Htmlable) {
return $value-toHtml();
}
return htmlspecialchars($value, ENT_QUOTES, 'UTF-8', false);
}
与 TP 的 E 方法冲突。
/**
* 抛出异常处理
* @param string $msg 异常消息
* @param integer $code 异常代码 默认为0
* @throws Think\Exception
* @return void
*/
function E($msg, $code=0) {
throw new Think\Exception($msg, $code);
}
我选择注释了 illuminate/database 的方法,搜索后发现没有其他地方用到这个方法,故注释。
完成后就可以愉快地使用 Laravel 的 ORM 来 coding 了。
PHP框架 Laravel Eloquent ORM 批量插入数据,怎么实现
PHP框架 Laravel Eloquent ORM 批量插入数据是通过传入数组实现的。
比如:
DB::table('users')-insert(array(
array('email' = 'taylor@example.com', 'votes' = 0),
array('email' = 'dayle@example.com', 'votes' = 0),
));
以上是操作表users,执行insert语句,参数是一个数组,封装了两条数据,这里可以自定义数据,insert内部就编程批量插入了。
然后调用save方法:
public static function create(array $attributes)
{
$model = new static($attributes);
$model-save();
return $model;
}
Laravel Eloquent save 触发了哪些事件
Illuminate/Database/Eloquent/Model.php
public function save(array $options = [])
{
$query = $this-newQueryWithoutScopes();
if ($this-fireModelEvent('saving') === false) {
return false;
}
if ($this-exists) {
$saved = $this-performUpdate($query, $options);
} else {
$saved = $this-performInsert($query, $options);
}
if ($saved) {
$this-finishSave($options);
}
return $saved;
}
首先触发的当然是saving,如果saving返回的是false,那么save就失败了,返回false
接着如果$this-exists,就是这个model不是新创建的,那么就需要进行更新操作
protected function performUpdate(Builder $query, array $options = [])
{
$dirty = $this-getDirty();
if (count($dirty) 0) {
if ($this-fireModelEvent('updating') === false) {
return false;
}
if ($this-timestamps Arr::get($options, 'timestamps', true)) {
$this-updateTimestamps();
}
$dirty = $this-getDirty();
if (count($dirty) 0) {
$numRows = $this-setKeysForSaveQuery($query)-update($dirty);
$this-fireModelEvent('updated', false);
}
}
return true;
}
看看更新干了什么,
首先如果这个模型dirty了,也就是脏了,也就是有属性改变了,那么才需要更新
先触发updating,更新失败了就false,
更新时间戳
这里又判断了count($dirty) 0,为什么??更updateTimestamps有什么关系吗?没有仔细看,以后再说吧
然后执行update,也就是写入了数据库
最后触发updated
那么如果这个对象是新建的,也就是需要执行插入操作,performInsert也做了差不多的事,
触发creating,
执行insert,插入数据库,
最后created。
最后回到save方法,如果更新或者插入操作成功了,那么就finishSave来结束save,
finishSave 触发了saved事件, 最后syncOriginal。
小结一下
新创建的对象,save依次触发 saving-creating-created-saved
已存在的对象,save依次触发 saving-updating-updated-saved
php eloquent 怎么安装orm
PHP框架 Laravel Eloquent ORM 批量插入数据是通过传入数组实现的。
比如:
DB::table('users')-insert(array(
array('email' = 'taylor@example.com', 'votes' = 0),
array('email' = 'dayle@example.com', 'votes' = 0),
));
以上是操作表users,执行insert语句,参数是一个数组,封装了两条数据,这里可以自定义数据,insert内部就编程批量插入了。