xml地图|网站地图|网站标签 [设为首页] [加入收藏]

laravel学习笔记之模型事件的几种用法示例,浅谈

来源:http://www.ccidsi.com 作者:集成经验 人气:161 发布时间:2019-07-24
摘要:Eloquent是什么 前言 有关 PHP  的 new static 延迟静态绑定,或然叫早先时期静态绑定,在 Laravel中相见二个行使上的主题素材。如下,在 Laravel 中调用 Model新增扩大少的时候,首先给 Mode

Eloquent是什么

前言

有关 PHP  的 new static 延迟静态绑定,或然叫早先时期静态绑定,在 Laravel 中相见二个行使上的主题素材。如下,在 Laravel 中调用 Model 新增扩大少的时候,首先给 Model 加了多个获取分表的点子:

Eloquent 是贰个 ORM,全名字为 Object Relational Mapping,翻译为 “对象关系映射”(若是只把它当成 Database Abstraction Layer 数组库抽象层那就太小看它了)。所谓 “对象”,就是本文所说的 “模型(Model)”;对象关联映射,即为模型间关系。汉语文书档案:

本文首要给咱们介绍了关于laravel模型事件用法的连带内容,文中通过示范代码介绍了laravel模型事件的有余用法,下面话没有多少说了,来共同看看详细的介绍吧。

protected function addToMessage($msgType, $userID, $commentID, $replyCommentID, $replyUserID, $gameID)
{
  if (!$userID) {
    return false;
  }

  $table = 't_message_' . hashID($userID, 100);
  $this->message->setTable($table)->create([
    'msg_type'     => $msgType,
    'user_id'     => $userID,
    'comment_id'    => $commentID,
    'reply_comment_id' => $replyCommentID,
    'reply_user_id'  => $replyUserID,
    'game_id'     => $gameID,
    'is_read'     => 0,
    'created_at'    => date('Y-m-d H:i:s'),
  ]);
  return true;
}

引用

用法示例

此处 setTable 方法是在 Model 里定义的获得分表的方法:

在实际支出中时常用到分库分表,比如用户表分成 100 张,那么那一年查询数据须求设置分表,举个例子 Laravel 的 Model 类中提供了 setTable 方法:

一 、简单狂暴(用于地方测验)

public function setTable($table)
{
  $this->table = $table;
  return $this;
}
/**
 * Set the table associated with the model.
 *
 * @param string $table
 * @return $this
 */
public function setTable($table)
{
 $this->table = $table;

 return $this;
}

路由中定义:

从报错日志中发觉 $this->table 并不曾卓有效能,但实际在调用 create 方法在此以前打字与印刷表名的时候是梦想的值,这里调用 create 方法为何$this->table 未有被重新初始化呢?

那正是说对数据表的增加和删除改查需求先 new 二个模型实例,再安装表名。如:

Event::listen('eloquent.updated: AppPost',function (){
 dump('测试一下修改事件');
});
Route::post('/post/{id}', 'PostController@update');

此间 $this->message 是一个承继 Model 类的模型类,在那之中 create 方法:

(new Circle())->setTable("t_group_" . hashID($userid, 20))
->newQuery()
->where('group_id', $request->group_id)
->update($attributes);

二 、生成事件和监听器

public static function create(array $attributes = [])
{
  $model = new static($attributes);

  $model->save();

  return $model;
}

本条异常的粗略,那么在模型间涉及比如 HasOne,HasMany 等应用这种办法的处境下,怎么着设置分表呢?

在 伊夫ntServiceProvider 定义对应涉及

位于 vendorlaravelframeworksrcIlluminateDatabaseEloquentModel.php Line 557.

找了半天没找到好的格局,以 HasOne 为例,看了 Model 类 HasOne 函数的兑现形式,未有地点可以安装表名,只可以复制一份 HasOne 方法开始展览改造。举例改成 myHasOne,加上 $table 参数能够安装表名,並且在指标实例化后调用 setTable,果然就足以了。

 protected $listen = [
  'AppEventsPostEvent' => [
    'AppListenersPostListener',
   ],
 ];


php artisan event:generate //生成文件

因为 Laravel 框架的那几个 Model 类是三个 abstract 类型,PHP 中 abstract 类能够用 new static 早先时期静态绑定的方法实例化,而 create 方法里 $model = new static($attributes) 实际上固然重新实例化了并赶回,而调用者 Model 类未有概念 table 属性,所以这个时候 $this->table 是从未有过值的。

代码如下:

event 中注入要操作的类

图片 1

public function detail()
{
 return $this->myHasOne(Circle::class, 'group_id', 'group_id', 't_group_' . hashID($this->userid, 20));
}

public function myHasOne($related, $foreignKey = null, $localKey = null, $table)
{
 $foreignKey = $foreignKey ?: $this->getForeignKey();

 $instance = (new $related)->setTable($table);

 $localKey = $localKey ?: $this->getKeyName();

 return new HasOne($instance->newQuery(), $this, $instance->getTable() . '.' . $foreignKey, $localKey);
}

listen 中handle 方法注入对应事件类

化解办法是用 save 方法就可以,如图所示。实际上 create 方法也调用了 save 方法。

不精晓大家有未有更优雅的章程。

 public function handle(PostEvent $event)
 {
  dump('测试一下修改事件');
 }

实验

本文由68399皇家赌场发布于集成经验,转载请注明出处:laravel学习笔记之模型事件的几种用法示例,浅谈

关键词: 68399皇家赌场

最火资讯