Laravel Eloquent 骚操作

1. Push 保存模型和关系

假设现在用户模型 User 和 微信 Wechat 是一对一关系,然后进行以下操作:

$user = User::where('name', 'wuqinqiang')->first();
$user->age = 18;
$user->wechat->nickName = "Remember";
$user->save();

那么此时,会保存用户信息,但是并不会保存对应 Wechat 的关联信息,想让它一起保存咋么办?也很简单。把 save 换成 push 即可。

$user->push();

2. 不想要模型事件

在使用 Eloquent 模型的时候,创建或者更新模型这些操作的时候,是有几个阶段的事件的,有时候可能因为业务上的需要,可能会监听某个事件执行某些操作。比如下面这段监听对应事件执行对应操作的代码:

public static function boot()
{
  parent::boot();
  static::creating(function ($model) {
    //业务逻辑
  });
}

那要是不想在操作时触发任何事件则么办?你可以执行一个回调函数而无需触发任何事件:

$user = User::withoutEvents(function () {
  return //保存或者更新代码
});

3. 检查模型是否更改

想知道从数据库查询获取出来的模型是否被动过手脚 (修改)? 也有办法。可以使用 isDirty

$ user = User :: where('name','wuqinqiang')->first();
$ user->isDirty(); // 还没被动过 返回 false
$ user->name ='curry';  
$ user->isDirty(); //模型被动过了 返回true 
$ user->isDirty('email'); // 可以传入参数  验证某个参数是否被动过,这个我还没碰过 当然 false
$ user->isDirty('name'); // true 

如果你还想具体了解到哪些是被动过了,可以使用:

$user->getDirty();  你将得到一个数组 ["name" => "curry"]
$user->getChanges();

仅当您使用 syncChanges() 保存模型或同步更改时,更改才会显示。

4.想看原始数据

既然上面提到是否被动过手脚,那动过手脚之后我又想看看之前的模样 (ps: 人就是这样麻烦)。强大的 Laravel Eloquent 也可以办到:

user = User :: where('name','wuqinqiang')->first();
$user->name = 'curry';
$user->getOriginal(); // 返回数组 "name" => "wuqinqiang"
$user->getOriginal('name'); //指定要看哪个属性的原值  "wuqinqiang"

5. firstOrCreate 查找或创建

在使用 firstOrCreate 或 updateOrCreate 之后,如果想知道是否是 create 的数据,常用于自动注册操作,只在第一次插入时执行派发积分等事件

$User = User::firstOrCreate(['name' => 'test'], ['email' => 'test@test.com']);
if($User->wasRecentlyCreated){
    // true 则是 create 的数据,赠送积分
}

6. append 模型追加字段

class User extends Model
{
  protected $appends = ['is_adult'];

  public function getIsAdultAttribute()
  {
    return $this->attribute['age'] > 18;
  }
}

这个操作大家是不是都用过,在模型里新增一个数据库不存在的字段,非常方便。但是 $appends 是全局的,所有的查询中都会添加 is_adult 这个字段。

User::select('id', 'name')->first();

像这样查询的时候甚至还会报错提示 age 字段不存在。

我们可以像这样,在查询的时候再将 is_adult 添加进查询结果集中。

$user = User::first();

$user->append('is_adult');

你以为这就完了么?不仅仅如此,如果我们查询的是多个用户怎么办,难道自己 for 循环 append 一遍么?不不不,我们优雅的 Laravel 已经为我们考虑过了。

$user = User::paginate(10);

$user->each->append('is_adult');

7. 解决 IDE 代码没有提示

没有提示:

User::where('sex', 'girl')->get();

在最前面加个 query ,轻轻松松娶富萝莉走上人生巅峰。

User::query()->where('sex', 'girl')->get();

8. 快速查找

User::query()->find(2);
User::query()->firstWhere(['name' => 'xxx']);

9. 获取原始属性

当你修改了一条 Eloquent 记录后,你可以用 getOriginal () 来获取原来的属性。

$user = App\User::first();
$user->name;                   // John
$user->name = "Peter";         // Peter
$user->getOriginal('name');    // John
$user->getOriginal();          // 原始的 $user 记录

10. 自定义 deleted_at 列

默认情况下,Laravel 使用 deleted_at 列来处理软删除。 您可以通过明确定义 DELETED_AT 属性来更改此设置。

class User extends Model
{
    use SoftDeletes;
    /**
     * 定义 "deleted at" 列的名字.
     *
     * @var string
     */
    const DELETED_AT = 'is_deleted';
}

或者定义一个访问方法。

class User extends Model
{
    use SoftDeletes;

    public function getDeletedAtColumn()
    {
        return 'is_deleted';
    }
}

11. 重新加载新模型

使用 fresh() 从数据库加载一个全新的模型实例。

$user = App\User::first();
$user->name;               // John
// 用户记录通过另一个线程更新了。 例如: 'name' 改成了 // Peter。
$updatedUser = $user->fresh(); 
$updatedUser->name;       // Peter
$user->name;              // John

12. 重新加载现有模型

你可以使用 refresh() 从数据库中的新值来重新加载现有模型。

$user = App\User::first();
$user->name;               // John
// 用户记录通过另一个线程更新了。 例如: 'name' 改成了 // Peter。
$user->refresh(); 
$user->name;              // Peter

注意: refresh() 还将更新现有模型的加载关系。

13. 检查模型是否相同

使用 is() 判定两个模型是否有相同的ID并且属于同一张表。

$user = App\User::find(1);
$sameUser = App\User::find(1);
$diffUser = App\User::find(2);
$user->is($sameUser);       // true
$user->is($diffUser);       // false

14. 克隆一个模型

使用 replicate() 克隆一个模型。它将复制一个模型的副本到一个新的、不存在的实例中。

$user = App\User::find(1);
$newUser = $user->replicate();
$newUser->save();

15. 在 find 方法中指定属性

使用 find() 或 findOrFail() 方法时,可以指定要选择的属性作为第二个参数。

$user = App\User::find(1, ['name', 'age']);
$user = App\User::findOrFail(1, ['name', 'age']);

Docker安装与部署

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

启动docker

sudo systemctl start docker

设置开机启动

systemctl enable docker

Laravel常用扩展包整理

Laravel常用扩展包整理

后台框架

composer require encore/laravel-admin

文档地址 https://laravel-admin.org/docs/zh

后台框架

composer require dcat/laravel-admin

文档地址 http://www.dcatadmin.com/docs/master/introduction.html

接口管理

composer require jasonc/api

文档地址 https://github.com/cjango/laravel-api

OSS文件扩展

composer require iidestiny/laravel-filesystem-oss

文档地址 https://github.com/iiDestiny/laravel-filesystem-oss

图片处理

composer require intervention/image

文档地址 http://image.intervention.io/

短信通知

composer require jasonc/sms

文档地址 https://github.com/cjango/laravel-sms

跨域请求

composer require fruitcake/laravel-cors

文档地址 https://github.com/fruitcake/laravel-cors

微信SDK

composer require "overtrue/laravel-wechat:~5.0"

文档地址 https://www.easywechat.com/docs/4.1/official-account/index

网络请求

composer require guzzlehttp/guzzle

文档地址 https://guzzle-cn.readthedocs.io/zh_CN/latest/

[Ubuntu]Git保存用户名和密码

Git保存用户名和密码

1、进入Git 配置文件。

~$ vim ~/.gitconfig   

2、修改配置文件,添加下面这一行。

[credential]  
    helper = store  

使用的时候,在输入一次用户名和密码之后,就不需要再提交用户名和密码。

CentOS下安装golang环境

1.下载安装包

https://golang.org/dl/

2.解压到 /usr/local

tar -C /usr/local -xzf go1.14.linux-amd64.tar.gz

3.配置环境变量

vi /etc/profile 
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
export GOPATH=/root/go
export PATH=$PATH:$GOPATH/BIN
source /etc/profile

4.设置代理

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct

十大基础算法之动态规划算法

动态规划(Dynamicprogramming)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。

动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。

关于动态规划最经典的问题当属背包问题。

算法步骤:

1、最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。

2、子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率。

十大基础算法之朴素贝叶斯分类算法

朴素贝叶斯分类算法是一种基于贝叶斯定理的简单概率分类算法。贝叶斯分类的基础是概率推理,就是在各种条件的存在不确定,仅知其出现概率的情况下,如何完成推理和决策任务。概率推理是与确定性推理相对应的。而朴素贝叶斯分类器是基于独立假设的,即假设样本每个特征与其他特征都不相关。

朴素贝叶斯分类器依靠精确的自然概率模型,在有监督学习的样本集中能获取得非常好的分类效果。在许多实际应用中,朴素贝叶斯模型参数估计使用最大似然估计方法,换言之朴素贝叶斯模型能工作并没有用到贝叶斯概率或者任何贝叶斯模型。

尽管是带着这些朴素思想和过于简单化的假设,但朴素贝叶斯分类器在很多复杂的现实情形中仍能够取得相当好的效果。

十大基础算法之Dijkstra算法

戴克斯特拉算法(Dijkstra’salgorithm)是由荷兰计算机科学家艾兹赫尔·戴克斯特拉提出。迪科斯彻算法使用了广度优先搜索解决非负权有向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。

该算法的输入包含了一个有权重的有向图G,以及G中的一个来源顶点S。我们以V表示G中所有顶点的集合。每一个图中的边,都是两个顶点所形成的有序元素对。(u,v)表示从顶点u到v有路径相连。我们以E表示G中所有边的集合,而边的权重则由权重函数w:E→[0,∞]定义。

因此,w(u,v)就是从顶点u到顶点v的非负权重(weight)。边的权重可以想像成两个顶点之间的距离。任两点间路径的权重,就是该路径上所有边的权重总和。已知有V中有顶点s及t,Dijkstra算法可以找到s到t的最低权重路径(例如,最短路径)。这个算法也可以在一个图中,找到从一个顶点s到任何其他顶点的最短路径。对于不含负权的有向图,Dijkstra算法是目前已知的最快的单源最短路径算法。

算法步骤:

1、初始时令S={V0},T={其余顶点},T中顶点对应的距离值

  若存在<V0,Vi>,d(V0,Vi)为<V0,Vi>弧上的权值

  若不存在<V0,Vi>,d(V0,Vi)为∞

2、从T中选取一个其距离值为最小的顶点W且不在S中,加入S

3、对其余T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值缩短,则修改此距离值

  重复上述步骤2、3,直到S中包含所有顶点,即W=Vi为止

扫一扫