月度归档:2025年07月

模型关联 编写方法,查询时可以调用方法。 with查询 循环

hasOne (本模型有一个外部模型,其外键
belongsTo(本模型中键属于外部模型的外键

一对一、一对多、多对多

关于软删除,默认关联是保留,不用额外操作,但是join的话需要把delete_time 的null判断加入。

一对一 hasOne (本模型有一个外部模型,其外键与本模型主键关联)belongsTo(本模型中键属于外部模型的外键,与外部模型的主键关联)

在user模型中需要关联模型的其中加入一个profile方法。其中Profile为已经存在的模型文件


public function profile(){
    return $this->hasOne(Profile::class);
}
#缩写了外键 profile中的user_id
$this->hasOne(Profile::class,"user_id","id");

表示User模型的id主键与profile模型中的外键user_id关联

public function profile()
    {
    	return $this->hasOne(Profile::class);
    }

下面是belongs 在profile模型 本模型中有个user_id 属于外部模型user的主键id关联

    public function user()
    {
        // 定义反向关联
        return $this->belongsTo(User::class, 'user_id');
    }

一对多 hasMany(本模型有多个外部模型) belongsTo (多个属于一个 所以还是用belongsTo)

return $this->hasMany(Book::class)->order('pub_time');
//上面是省略参数,
//尾部的order可以实现排序
return $this->hasMany(Book::class, 'user_id', 'id')->order('pub_time');
目前的User模型本省的主键,与book模型的user_id实现多个关联

namespace app\model;

use think\Model;

class User extends Model
{
	public function book()
    {
    	return $this->hasMany(Book::class)->order('pub_time');
    }
}

多对多 belongsToMany 有4个参数 【引入模型参数】【 本模型参数】

至少3张表

  • user 用户表 模型
  • role权限表 模型
  • user_role用户权限表(中间表不需要建立模型)
public function roles(){
    return $this->belongsToMany(Role::class, 'user_role', 'role_id', 'user_id');
}

public function users(){
    return $this->belongsToMany(User::class, 'user_role', 'user_id', 'role_id');
    }

方法 :本模型为user的情况下

1.为外表模型

2.关联表(不用模型)

3.关联表中,外表模型的外键 role_id

4.关联表中 ,本表(当前模型)的关联的外键user_id

5.id 本模型的主键 user 可以省略

6.id 关联模型的主键 role 可以省略

》》》with 关联查询《《《 关联模型再关联

$m=$b->with([“a.c”])->select()

$b模型中a是关联,a与c关联 ,
访问$m 循环 $a 循环 $c 前端使用多个volist去取出数据

多对多 中间表 pivot: $m[‘pivot’][‘xxx’];//中间表数据

ORDER 排序

一对多

return $this->hasMany(LeaseModel::class,"lease_id",'id')->order("po_id");
//按照关联表(LeaseModel) 的po_id排序

多对多

    public function propertyone(){
        return $this->belongsToMany(PropertyOneModel::class,'lease','po_id','lease_id')->order("propertyone.id");
    }

//propertyone的id排序
->order("id")
//中间表 lease的id 排序

thinkCMF 登入后台的页面设置

位置:/你的项目目录/vendor/thinkcmf/cmf-app/src/admin/controller/MainController.php

其中的:public function index(){

}

中添加跳转。

举例:


    public function index()
    {
        $aid=cmf_get_current_admin_id();
        if($aid>1&&$aid<30){
            return $this->redirect(url("portal/topics/search"));//跳转到会议页面,直接跳转,后期需要修改
        }

文件上传 Thinkcmf thinkphp

HTML前端模版代码:

<div class="row">
                    <div class="file_model col-md-12">
                        <script type="text/html" id="files-item-tpl">
                                <li id="saved-file{id}">
                                    <input id="file-{id}" type="hidden" name="file_urls[]" value="{filepath}">
                                    <input class="form-control" id="file-{id}-name" type="text" name="file_names[]" value="{name}"
                                            style="width: 200px;" title="文件名称">
                                    <a class="btn btn-info" id="file-{id}-preview" href="{preview_url}" target="_blank"><i class="fa fa-download fa-fw"></i></a>
                                    <a class="btn btn-default" href="javascript:uploadOne('文件上传','#file-{id}','file');"><i class="fa fa-upload fa-fw"></i></a>
                                    <a class="btn btn-danger" href="javascript:(function(){$('#saved-file{id}').remove();})();"><i class="fa fa-trash fa-fw"></i></a>
                                    <a class="btn btn-success" href="javascript:(function(){$('#saved-file{id}').before($('#saved-file{id}').next());})();"><i class="fa fa-arrow-down fa-fw"></i></a>
                                </li>
                            </script>

                        <div class="upload_file_div">
                            <h3>附件</h3>
                            <ul id="files" class="pic-list list-unstyled form-inline">
                            </ul>
                            <a href="javascript:uploadMultiFile('附件上传','#files','files-item-tpl','file');"
                                class="btn btn-default">选择文件</a>
                        </div>
                    </div>
                </div>
                <hr>

JS代码

var c=[];
for (var k = 0; k < $('input[name="file_urls[]"]').length; k++) {
    var e={
name:$('input[name="file_names[]"]')[k].value,
url:$('input[name="file_urls[]"]')[k].value
}
    c.push(e);
}
console.log(c)
//c为数组格式的files信息
var files={files:c}

data={files:files}

PHP中

$ins['files']=json_encode($this->request->post("files"));
//直接存储到mysql中的表的files键中

编辑页面

PHP 上执行

注意 默认files值是json存储你需要使用json_decode将其转为array.

$info->files=json_decode($info->files,TRUE)
$this->assign(["info"=>$info]);
#传递给模版

前段模版:给前段传值$info,默认的files 不用操作

    <div class="row">
        <script type="text/html" id="files-item-tpl">
            <li id="saved-file{id}">
                <input id="file-{id}" type="hidden" name="file_urls[]" value="{filepath}">
                <input class="form-control" id="file-{id}-name" type="text" name="file_names[]" value="{name}"
                       style="width: 200px;" title="文件名称">
                <a class="btn btn-info" id="file-{id}-preview" href="{preview_url}" target="_blank"><i class="fa fa-download fa-fw"></i></a>
                <a class="btn btn-default" href="javascript:uploadOne('文件上传','#file-{id}','file');"><i class="fa fa-upload fa-fw"></i></a>
                <a class="btn btn-danger" href="javascript:(function(){$('#saved-file{id}').remove();})();"><i class="fa fa-trash fa-fw"></i></a>
                <a class="btn btn-success" href="javascript:(function(){$('#saved-file{id}').before($('#saved-file{id}').next());})();"><i class="fa fa-arrow-down fa-fw"></i></a>
            </li>
        </script>
    </div>
    <div class="col-md-12">
            <span>附件</span>
            <div>

                <ul id="files" class="pic-list list-unstyled form-inline">
                    <notempty name="info.files.files">
                        <foreach name="info.files.files" item="vo">
                            <php>$file_url=cmf_get_file_download_url($vo['url']);</php>
                            <li id="saved-file{$key}">
                                <input id="file-{$key}" type="hidden" name="file_urls[]"
                                        value="{$vo.url}">
                                <input class="form-control" id="file-{$key}-name" type="text"
                                        name="file_names[]"
                                        value="{$vo.name}" style="width: 200px;" title="图片名称">
                                <a class="btn btn-info" id="file-{$key}-preview" href="{$file_url}" target="_blank"><i class="fa fa-download fa-fw"></i></a>
                                <a class="btn btn-default" href="javascript:uploadOne('文件上传','#file-{$key}','file');"><i class="fa fa-upload fa-fw"></i></a>
                                <a class="btn btn-danger" href="javascript:(function(){$('#saved-file{$key}').remove();})();"><i class="fa fa-trash fa-fw"></i></a>
                                <a class="btn btn-success"  href="javascript:(function(){$('#saved-file{$key}').before($('#saved-file{$key}').next());})();"><i class="fa fa-arrow-down fa-fw"></i></a>
                            </li>
                        </foreach>
                    </notempty>
                </ul>
                <a href="javascript:uploadMultiFile('附件上传','#files','files-item-tpl','file');"
                    class="btn btn-default">选择文件</a>
            </div>
    </div>

编辑修改的话如前面的一样!

Tips:

在模型定义中使用protected $type 进行自动转换,如:可以设置为array 这样可以直接插入array的files

<?php
namespace app\model;

use think\Model;

class User extends Model 
{
    protected $type = [
        'status'    =>  'integer',
        'score'     =>  'float',
        'birthday'  =>  'datetime',
        'files'      =>  'array',
    ];
}

JS动态添加DIV 使用onclick绑定方法调用本地属性 删除onclick

以及其调用方法使用(event) ,$(event.currentTarget) 来调用方法

JS动态添加DIV 使用onclick绑定方法调用本地属性

<script>
     var div=$("<div class='one' onclick='onex(event)'>ssssssssss</div>");
     div.attr("id","div_aaaa");
     $("#info").append(div);


     function onex(event){
            alert($(event.currentTarget).attr("id"));
        }
</script>

button的onclick 实现删除本标签或者父辈标签

<button class="child" onclick="this.parentNode.parentNode.remove()">删除</button>