Laravel笔记
本文环境 PHP7.3,Laravel6.0 不懂的可以评论或联系我邮箱:owen@owenzhang.com 著作权归OwenZhang所有。商业转载请联系OwenZhang获得授权,非商业转载请注明出处。
修改https
域名https 修改.env的APP_URL 修改config/admin.php的’https’ => env(‘ADMIN_HTTPS’, true)
dcat-admin
表单提交后pid为null,改为0存数据库
protected function form()
{
.....
if (request()->parent_id == null) {
$form->parent_id = 0;
}
}
Dcat Admin 关闭代码生成器
laravel5\config\admin.php ‘helpers’ => [ ‘enable’ => true,// 改成false即可 ]
表单 子表新增
//Controller类
protected function form()
{
.....
$form->hasMany('basedataBanks', '银行管理', function (Form\NestedForm $form){
$form->select('company', '公司名称')->options(['1' => '公司1', '2' => '公司2']);
$form->text('bank', '开户银行');
$form->text('account', '账号');
});
}
//Model类
public function basedataBanks()
{
return $this->hasMany(BasedataBank::class, 'basedata_supplier_id', 'id');
}
表单,select多级联动
//1,表单代码
$form->select('name', '存管方')->options(
(new BasedataSupplier())->getDataByType(BasedataSupplier::TYPE_DEPOSITOR)
->pluck('name', 'id')
)->required()
->loads(['platform', 'contract_number'], ['/api/basedata-depositor/platformList', '/api/basedata-depositor/contractNumberList']);
$form->select('platform', '存管地点')->disable();
$form->select('contract_number', '存管合同号')->disable();
//2,路由
Route::get('basedata-depositor/platformList', 'ProjectController@platformList');
Route::get('basedata-depositor/contractNumberList', 'ProjectController@contractNumberList');
//3,存管地点的select数据
public function platformList(Request $request)
{
$id = $request->get('q');
$add = BasedataSupplier::query()->where('id', $id)->value('addr');
return [0 => $add];
}
public function contractNumberList(Request $request)
{
$id = $request->get('q');
$add = BasedataSupplier::query()->where('id', $id)->value('contract_number');
return [0 => $add];
}
//4,vendor/encore/laravel-admin/src/Form/Field/Select.php
//找到public function load 和public function loads ;两个地方下面添加
$(document).off('change', "{$this->getElementClassSelector()}");
项目备注
前端网站
前端网站文件,dist文件夹内复制到项目public下覆盖替换,另外将dist文件夹内index.html代码复制替换resources/views/welcome.blade.php
判断请求是get还是post
request()->isMethod(‘post’) request()->isMethod(‘get’) //获取get或者post都参数id值 $request = request()->all(); $request[‘id’];
Redis
1.切换数据库
1.1 config/database.php
'redis' => [
'douying' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => '10',
],
],
hset
1.2 调用
$redis = Redis::connection('douying');
$redis->hset('report:www', $oaid, $adDataJson);
数据库
字段自增+1
//更新浏览量+1
Article::query()->where('id', '=', $id)->update(
[
'pageview' => \DB::raw('pageview + 1'),
]
);
获取某字段ID数组
/**
* @notes : 获取某字段ID数组
* @param $where
* @param $value
* // $where = [];
* // $where[] = [
* // 'channel_key',
* // '=',
* // $channelKey,
* // ];
* // $where[] = [
* // 'created_at',
* // '>=',
* // date('Y-m-d')
* // ];
* @return mixed
* @author: OwenZhang
* @time : 2023/5/9 16:39
*/
public static function getPluckIdArr($where, $value)
{
return self::where($where)->pluck($value)->toArray();
}
单个值
/**
* 有条件的获取值
*
* @param array $where
* @param string $value
*/
public function getValue(array $where, string $value)
{
return self::where($where)->value($value);
}
有条件的获取一条记录
/**
* 有条件的获取一条记录
*
* @param $where
*
* @return array
*/
public function getOne($where): array
{
$res = self::where($where)->first();
return $res ? $res->toArray() : [];
}
有条件的获取总数
/**
* 有条件的获取总数
*
* @param array $where
* @param string $value
*/
public function getSum(array $where, string $value)
{
return self::where($where)->sum($value);
}
获取列表
/**
* @notes : 获取列表
* @param array $select
* @param array $where
* @param int $page
* @param int $limit
* @param string $order
* @param string $orderSort
* @return array
* @author: OwenZhang
* @time : 2023/4/17 13:42
*/
public function getList(array $select, array $where, int $page, int $limit, string $order = 'id', string $orderSort = 'desc'): array
{
$res = $this->select($select)
->where($where)
->orderBy($order, $orderSort)
->offset(($page - 1) * $limit)
->limit($limit)
->get();
return $res ? $res->toArray() : [];
}
连表查询
$list = DB::table('recharge_orders')->select('recharge_orders.user_id', 'devices.id', 'devices.device_info')
->leftJoin('devices', 'devices.uid', '=', 'recharge_orders.user_id')
->where('recharge_orders.status', '=', 3)
->where('recharge_orders.created_at', '>=', '2023-04-24 00:00:00')
->where('devices.device_info', '<>', '')
->groupBy('recharge_orders.user_id')
->offset($page)
->limit($limit)
->get()
->toArray();
事务
//事务
//修改用户水晶和鲸钻变更数据
try {
DB::beginTransaction();
//修改用户水晶和鲸钻变更数据
$beans = $money * 100 / $exchangeMoney;
DB::table('users')
->where('id', $userId)
->update([
'beans' => $userBeans - $beans,
'updated_at' => date('Y-m-d H:i:s'),
]);
//写入提现表
//手续费
$commission = $money * $serviceCharge / 100;
$id = DB::table('order_transfer')
->insertGetId([
'user_id' => $userId,
'order_no' => createOrderNo('T'),
'money' => $money,
'commission' => $commission,
'reality_money' => $money - $commission,
'type' => $type,
'status' => OrderTransfer::STATUS_PENDING,//待处理
'source' => $source,
'source_number' => $beans,
'os' => $os,
'created_at' => date('Y-m-d H:i:s'),
]);
//支出水晶
DB::table('user_coins_change_log')
->insert([
'user_id' => $userId,
'type' => 2,//类型(1.收入 2.支出)
'coin_type' => 3,//币种(1.鲸钻 2.金币 3.水晶)
'before_coins' => $userBeans,//变动前值
'coins' => $beans,//变动值,
'after_coins' => $userBeans - $beans,//变动后值,
'table_type' => 'order_transfer',//相关表
'relation_id' => $id,//相关记录id
'remark' => '水晶提现' . $money . '元',//备注
'created_at' => date('Y-m-d H:i:s'),
]);
DB::commit();
return ['code' => 200, 'msg' => '申请提交成功,预计7个工作日到账!', 'data' => ['money' => $beansToMoney - $money, 'money_text' => $beansToMoney - $money . '元']];
} catch (\Exception $e) {
DB::rollback();
return ['code' => 415, 'msg' => '数据更新失败' . $e->getMessage()];
}
whereor orwhere orwhereraw
if ($titlecontent = $this->request->get('titlecontent')){
if (!$this->request->get('title')){
$msg = $msg->where('title', 'like', '%' . $titlecontent . '%');
}
$msg = $msg->orWhereRaw('(content like ? and status = ?)', ["%{$titlecontent}%", 1]);
}
根据id获取列表
//根据id获取列表
public function getListByIdArr($idArr)
{
if (!$idArr) {
return [];
}
$idArr = [1];
$list = self::select('id', 'name')
->whereIn('id', $idArr)
->get();
$data = [];
if ($list) {
$list = $list->toArray();
foreach ($list as $value) {
$data[$value['id']] = $value;
}
}
return $data;
}
服务器配置Nginx
location / {
try_files $uri $uri/ /index.php?$query_string;
}
执行定时任务
php artisan toufang_bubao_kszf 一直执行 php /www/wwwroot/owenweb/artisan schedule:work
定时任务的问题
定时任务调取不到//bootstrap/function.php 全局函数 很坑 Symfony\Component\Debug\Exception\FatalThrowableError : Call to undefined function App\Lib\Utils\arrayToObject()
打印mysql语句
DB::connection()->enableQueryLog();
var_dump(DB::getQueryLog());
模板引擎渲染
return Admin::content(function (Content $content) use ($lists) {
$content->description('文本管理');
$content->breadcrumb(
['text' => '文本管理', 'left-menu-active' => '文本管理']
);
$content->body(view('shuabao-backend::text.index', compact('lists')));
});
<small>{{ $description }}</small>
!()[https://oscimg.oschina.net/oscnet/up-1a9fdb067b6ec3086f5446bd4c0f272b263.png]
数据迁移
迁移就像是数据库的版本控制, 允许团队简单轻松的编辑并共享应用的数据库表结构,迁移通常和 Laravel 的 数据库结构生成器配合使用,让你轻松地构建数据库结构。如果你曾经试过让同事手动在数据库结构中添加字段,那么数据库迁移可以让你不再需要做这样的事情。
创建表和插入多条记录
public function up()
{
\DB::statement("
CREATE TABLE `classifys` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`parent_id` int(11) NULL DEFAULT '0' COMMENT '父ID',
`title` varchar(191) NOT NULL DEFAULT '' COMMENT '名称',
`type` tinyint(2) NOT NULL DEFAULT '1' COMMENT '类型:1=产品',
`status` tinyint(2) NOT NULL DEFAULT '1' COMMENT '状态:1=显示 2=隐藏',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`deleted_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分类表';
");
\DB::statement("
INSERT INTO `classifys` (`title`,`created_at`) VALUES ('产品分类1','2024-02-22 15:22:41');
");
\DB::statement("
INSERT INTO `classifys` (`title`,`created_at`) VALUES ('产品分类2','2024-02-22 15:22:41');
");
}
生成迁移
php artisan make
:migration create_users_table
新的迁移位于database/migrations
目录下。每个迁移文件名都包含时间戳,以便让 Laravel 确认迁移的顺序。
--table
和--create
选项可用来指定数据表的名称,或是该迁移被执行时是否将创建的新数据表。这些选项需在预生成迁移文件时填入指定的数据表:
php artisan make
:migration create_users_table
—create
=users
php artisan make
:migration add_votes_to_users_table
—table
=users
运行迁移
php artisan migrate
在生产环境强制执行迁移
一些迁移操作是具有破坏性的, 这意味着可能会导致数据丢失。 为了防止有人在生产环境中运行这些命令, 系统会在这些命令被运行之前与你进行确认。如果要强制忽略系统的提示运行命令, 则可以使用--force
标记:
php artisan migrate
—force
回滚迁移
若要回滚最后一次迁移, 可以使用rollback
命令。 此命令将回滚最后一次“迁移”的操作,其中可能包含多个迁移文件:
php artisan migrate
:rollback
你可以在rollback
命令后面加上step
参数,来限制回滚迁移的个数。 例如,以下命令将回滚最近五次迁移:
php artisan migrate
:rollback
—step
=5
migrate:reset
命令可以回滚应用程序中的所有迁移:
php artisan migrate
:reset
使用单个命令来执行回滚或迁移
migrate:refresh
命令不仅会回滚数据库的所有迁移还会接着运行migrate
命令。 这个命令可以高效地重建整个数据库:
php artisan migrate
:refresh
// Refresh the database and run all database seeds…
php artisan migrate
:refresh
—seed
使用refresh
命令并提供step
参数来回滚并再执行最后指定的迁移数。例如, 以下命令将回滚并重新执行最后五次迁移:
php artisan migrate
:refresh
—step
=5
删除所有表 & 迁移
php artisan migrate
:fresh
php artisan migrate
:fresh
—seed
调整到另外一个路由
return route('FilePull', $arr);
Route::get('file', \[ 'as' =\> 'FilePull', 'alias' =\> '获取文件', 'uses' =\> 'FileController@getFile' \]);
删除和软删除
_Cases::find($id)->delete();_ Cases::destroy($id); _//__软删除恢复
// Cases::find($id)->restore();_
永久删除模型
//
强制删除单个模型实例...
$flight->forceDelete();
//
强制删除所有关联模型...
$flight->history()->forceDelete();
给参数默认值
$request->input('company_name',’sdfsaf’);
模型关联(morphTo,morphMany)
在网站开发的过程中,经常会遇到 评论商品,评论文章, 评论店铺 等等,在处理这样的需求的时候, 经常会新建一张 评论表, 然后通过 一个 type字段来区分 评论的对象
比如某T记录表内有存其他表的记录
table_type varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '相关表',
relation_id int(11) NOT NULL DEFAULT '0' COMMENT '相关记录id',
然后要查各个字表记录 就可以用到morphTo其实和with一样
使用方法
```
public function getApiList($search, $select = 'user_coins_change_log.*', $page = 1, $limit = 15)
{
return $this->filterSearch($search)->selectRaw($select)
->with('coinChangeTable')
->orderBy('id', 'desc')->offset(($page - 1) * $limit)->limit($limit)
->get()
->toArray();
}
//table_type 和 relation_id是表字段名
public function coinChangeTable()
{
return $this->morphTo('coinChangeTable', 'table_type', 'relation_id');
}
```
配置
\app\Providers\AppServiceProvider.php ,需要在这个文件增加映射
play_game_record goods_order user_currency_exchange_log order_transfer 这4个相当于是T记录表的table_type的值 有新的值就得 在这个文件添加一个
/**
* 自定义多态关联的类型字段
*/
private function bootEloquentMorphs()
{
Relation::morphMap([
'play_game_record' => 'App\Models\PlayGameRecord',
'goods_order' => 'App\Models\GoodsOrder',
'user_currency_exchange_log' => 'App\Models\UserCurrencyExchangeLog',
'order_transfer' => 'App\Models\Order\OrderTransfer'
]);
}
The bootstrap/cache directory must be present and writable错误
解决方式
php artisan cache:clear
Buy me a cup of coffee 🙂
觉得对你有帮助,就给我打赏吧,谢谢!