>

PHP完毕修改个中关联表数据的三种方法_php技艺

- 编辑:金沙国际平台登录 -

PHP完毕修改个中关联表数据的三种方法_php技艺

本文以示例形式展示了PHP实现更新中间关联表数据的两种方法。分享给大家供大家参考之用。具体方法如下:

现在是2017年2月5日,从开始接触Laravel也有小一年来了,这篇文章将记录我使用Laravel的一些新得。新的想法也将随时更新到这篇文章中。

首先,中间关联表:这里的中间表只存表1的主键和表2的主键,即多对多的形式。执行数据添加和删除为框架内部方法,不属于思路部分。

1.目录别名

方法一:先全部删除旧数据,后添加新数据

1.1说明

在ShenCom他们有一点做的很好,就是把框架外的扩展全部放在了一个独立的目录里面,没有去破坏Laravel框架本身的结构,让框架保持了原来的特性,又增加了新的功能。

图片 1

1-目录别名.png

$res = $this->classes->classEdit; //修改主表数据if{ //先删除关联表数据 $bool = $this->lesson_classes->lessonClassesDel { //循环组装条件,添加数据 foreach { $arr = array('class_id'=>$id, 'lesson_id'=>$val); //数据 $res = $this->lesson_classes->lessonClassesAdd; //执行添加 } } $this->show_tips;}else{ $this->show_tips;}

1.2用法

使用该方法弊端:大批量删除数据这块儿不安全,存在一定程度的安全隐患。

1.2.1添加主服务文件

在 appProvidersAppServiceProvider的boot方法中添加
App::register("YaZhouYaZhouServiceProvider");

方法二:只添加需要的,只删要删的

1.2.2起别名

compser.json里面增加一个autoload选项。
执行命令composer dump-autpload

//库中查出的旧数据:$arr_old //提交过来的新数据:$arr_new $intersect = array_intersect; //交集$result_del = array_diff; //旧数据中需要删除的$result_add = array_diff; //新数据中需要增加的//添加新增数据if($result_add && is_array{ foreach { $data_add = array('class_id'=>$id, 'lesson_id'=>$val); //数据 $bool_add = $this->lesson_classes->lessonClassesAdd; //执行添加 }}//删除需要清除的数据if($result_del && is_array{ foreach { $bool_del = $this->lesson_classes->lessonClassesDel; //执行删除 }}if($bool_add && $bool_del){ $this->show_tips;}else{ $this->show_tips;}

2.模型(Model)的定义

该方法特点:有针对性的添加数据和删除数据,较第一种方法,安全性高

2.1简单示例

namespace YzModels;

use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentSoftDeletes;

class Test extends Model{
    use SoftDeletes;

    protected   $primaryKey  =   "id";  
    protected   $table       =   "test";
    protected   $guarded     =   ["id"];
    public      $timestamps  =   false;
}

希望本文所述对大家的PHP程序设计有所帮助。

2.2代码说明

protected $table
指定当前模型对应的数据表名。
protected $primaryKey
指定当前数据表的主键,默认id。
public $timestamps
默认情况下,Eloquent期望created_at和updated_at已经存在于数据表中,如果你不想要这些Laravel自动管理的列,在模型类中设置$timestamps属性为false。
protected $guarded/$fillale
在使用create方法保存一个新的模型时,所有的Eloquent模型都通过批量赋值(Mass Assignment)进行保护,需要指定模型的fillableguarded属性。在fillable里面的都是可以被赋值的(白名单),在guarded里面的都是不可以被赋值的(黑名单),fillable和guarded二选一。
use SoftDeletes
软删除,要求数据表中以一个字段“deleted_at”。被软删除的记录并没有被真正的删除,只是在“deleted_at”字段记录了操作时间。
Model::withTrashed()->...,同时获取被软删除的记录。
Model::onlyTrashed()->...,只获取被软删除的记录。
$record->restore();,恢复被软删除的记录。
$record->forceDelete(),强制删除。
$record-> history() -> forceDelete(),强制删除所有关模型。

2.3扩展

查询作用域

作用域允许你定义一个查询条件的通用集合,这样就可以在应用中方便地复用。详情参见,Laravel5.1中文文档。

3.模型关系

3.1一对一关系

3.1.1关系的定义
namespace YzTestModels;

use IlluminateDatabaseEloquentModel;

class User extends Model{
    //  获取关联到用户的手机
    public function phone(){
        return $this->hasOne("YzTestModelsPhone");
        // 这种写法默认Phone模型中有一个user_id外键,默认与当前模型的id关联

        // return $this->hasOne("YzTestModelsPhone", "user_id");
        // 指定Phone模型中的外键,默认与当前模型的id关联

        // return $this->hasOne("YzTestModelsPhone", "user_id", "id");
        // 指定phone模型的外键,同时指定当前模型的关联键,推荐使用
    }
}
3.1.2定义关系的相对关联
namespace YzTestModels;

use IlluminateDatabaseEloquentModel;

class Phone extends Model{
    public function user(){
        // 找到电话所属的用户
        return $this->belongsTo("YzTestModelsUser");
        // 默认通过当前表的user_id去匹配user表的id

        // return $this->belongsTo("YzTestModelsUser", "user_id");
        // 指定当前表的关联字段,去与主表的id字段进行匹配

        // return $this->belongsTo("YzTestModelsUser", "user_id", "id");
        // 指定当前表的user_id与User表的id进行匹配,推荐使用
    }
}
3.1.3一对一关系的使用

$phone = User::find(1)->phone;

3.2 一对多关系

3.2.1关系的定义
namespace YzTestModels;

use IlluminateDatabaseEloquentModel;

class Post extends Model{
    /*博客数据*/

    public function comments(){
        // 获取博客的评论
        return $this->hasMany("YzTestModelsComment");

        // $this->hasMany("YzTestModelsComment", "post_id");
        // $this->hasMany("YzTestModelsComment", "post_id", "id");
    }
}
3.2.2定义关系的相对关联
namespace YzTestModels;

use IlluminateDatabaseEloquentModel;

class Comment extends Model{
    /*博客的评论*/

    public function post(){
        return $this->belongsTo("YzTestModelsPost");

        // return $this->belongsTo("YzTestModelsPost", "post_id");
        // return $this->belongsTo("YzTestModelsPost", "post_id", "id");
    }
}
3.2.3一对多关系的使用
$comments = AppPost::find(1)->comments;
$comments = AppPost::find(1)->comments()->where('title', 'foo')->first();

$comment = AppComment::find(1);
echo $comment->post->title;

3.3多对多关系

实现多对多关系需要一个中间表。比如,一个用户(user)拥有多种角色(role),那么我们就需要一个中间表(user_role)。

3.3.1关系的定义
public function roles(){
        return $this->belongsToMany("YzTestModelRole");
        // 省略写法,要求中间表的名字为role_user,且中间表包含role_id和user_id两个字段

        // return $this->belongsToMany("YzTestModelsRole", "user_role");
        // 半完整写法

        // return $this->belongsToMany("YzTestModelsRole", "user_role", "user_id", "role_id");
        // 完整写法
    }
3.3.2定义关系的相对关联
namespace YzTestModels;

use IlluminateDatabaseEloquentModel;

class Role extends Model
{
    // 用户角色

    public function users()
    {
        // 找到属于当前角色的用户
        return $this->belongsToMany("YzTestModelsUser");

        // return $this->belongsToMany("YzTestModelsUser", "user_role");
        // return $this->belongsToMany("YzTestModelsUser", "user_role", "role_id", "user_id");
    }
}
3.3.3多对多关系的使用
$user = AppUser::find(1);
foreach ($user->roles as $role) {
    //
}

$roles = AppUser::find(1)->roles()->orderBy('name')->get();

3.4插入关联模型

3.4.1插入一个关联模型
$comment = new AppComment(['message' => 'A new comment.']);
$post = AppPost::find(1);
$comment = $post->comments()->save($comment);
3.4.2插入多个关联模型
$post = AppPost::find(1);
$post->comments()->saveMany([
    new AppComment(['message' => 'A new comment.']),
    new AppComment(['message' => 'Another comment.']),
]);

除了save和saveMany方法外,还可以使用create方法,该方法接收属性数组、创建模型、然后插入数据库。save和create的不同之处在于save接收整个Eloquent模型实例而create接收原生PHP数组。

$post = AppPost::find(1);
$comment = $post->comments()->create([
    'message' => 'A new comment.',
]);
3.4.3更新关联模型

更新belongsTo关联的时候,可以使用associate方法,该方法会在子模型设置外键。

$account = AppAccount::find(10);
$user->account()->associate($account);
$user->save();
3.4.4移除关联模型

移除belongsTo关联的时候,可以使用dissociate方法。该方法在子模型上取消外键和关联。

$user->account()->dissociate();
$user->save();
3.4.5多对多关系的附加
$user = AppUser::find(1);
$user->roles()->attach($roleId);

附加关联关系到模型,还可以以数组形式传递额外被插入数据到中间表:
$user->roles()->attach($roleId, ['expires' => $expires])

3.4.6多对多关系的移除
// 从指定用户中移除角色...
$user->roles()->detach($roleId);
// 从指定用户移除所有角色...
$user->roles()->detach();

为了方便,attach和detach还接收数组形式的ID作为输入。

$user = AppUser::find(1);
$user->roles()->detach([1, 2, 3]);
$user->roles()->attach([1 => ['expires' => $expires], 2, 3]);
3.4.7触发父级时间戳

当一个模型属于另外一个时,例如Comment属于Post,子模型更新时父模型的时间戳也被更新将很有用,例如,当Comment模型被更新时,你可能想要”触发“创建其所属模型Post的updated_at时间戳。Eloquent使得这项操作变得简单,只需要添加包含关联关系名称的touches属性到子模型中即可。

本文由编程发布,转载请注明来源:PHP完毕修改个中关联表数据的三种方法_php技艺