有没有办法在 Laravel 中取两个日期之间的数字并减去它

Posted

技术标签:

【中文标题】有没有办法在 Laravel 中取两个日期之间的数字并减去它【英文标题】:Is there a way to take the number between two dates and subtract with it in Laravel 【发布时间】:2020-12-15 01:33:00 【问题描述】:

所以我一直在尝试找到一种方法来获取/获取字段“from”和“to”(离开表格)中两个日期之间的数字,然后获取该数字(例如,它是 7)并减去它用户表中的另一个数字 a 来自名为 leaveBalance 的字段,它的默认数字为 20,所以我希望 (20 -7) 并将结果保存在请求休假的特定用户中,之后的 leaveBalance 字段是改变了,也可以添加一个 if 语句来检查日期之间的数字是否大于我们在 leaveBalance 上允许的数字以返回错误消息

这是请假表

    身份证 user_id 来自 到 类型 说明 状态 留言

user 表有 leaveBalance 字段,两个表没有外键关系 leave 上的 user_id 只存储创建 leave 时经过身份验证的用户的 id,然后只显示该 id 的叶子在用户视图上创建

这是离开控制器

public function create()
     
        $leaves = Leave::latest()->where('user_id',auth()->user()->id)->paginate(5);
        return view('leave.create',compact('leaves'));
    
public function store(Request $request)
    
        $this->validate($request,[
            'from'=>'required',
            'to'=>'required',
            'description'=>'required', 
            'type'=>'required'
            ]);
            $data=$request->all();
            $data['user_id']=auth()->user()->id;
            $data['message']='';
            $data['status']=0;
            $leave =Leave::create($data);
            
            $admins = Admin::all();
            $users = User::where('role_id', 2)->get();

            foreach ($admins as $admins) 
                foreach($users as $users)
                $admins->notify(new LeaveSent($leave));
                $users->notify((new LeaveSent($leave)));
            
        
        return redirect()->back()->with('message','Leave Created');

    

这是休假模式:


    use Notifiable;

    protected $guarded=[];
    
    public function user()
        return $this->belongsTo(User::class,'user_id','id');   
     


这是离开的观点

<div class="card-body">
                    <form method="POST" action="route('leaves.store')">
                        @csrf

                        <div class="form-group">
                            <label>From Date</label>
                            <div class="col-md-6">
                                <input class="datepicker" type="text" class="form-control @error('from') is-invalid @enderror" name="from" required="">

                                @error('from')
                                    <span class="invalid-feedback" role="alert">
                                        <strong> $message </strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group">
                            <label>To Date</label>
                            <div class="col-md-6">
                                <input class="datepicker1" type="text" class="form-control @error('to') is-invalid @enderror" name="to" required="">

我愿意在这方面使用碳我对碳了解不多,但我知道它用于日期等,但由于我使用日期选择器,这可能吗?

【问题讨论】:

您可能会考虑编写您的自定义规则? laravel.com/docs/7.x/validation#custom-validation-rules 这是为了回信吗?我想我可以为我在这里添加一个简单的 if 语句,所以我还在学习东西,谢谢你,我一定要读完它 【参考方案1】:

您可以使用它来检查他是否休假了多少天,您可以构建函数来执行此操作并返回结果

$from = new DateTime("2020-08-20");
$to = new DateTime("2020-08-28");

$diff = $to->diff($from)->format("%a"); // 8

然后将其传递给结果,jaguar 可以帮助您解决此问题

    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tempusdominus-bootstrap-4/5.0.0-alpha14/css/tempusdominus-bootstrap-4.min.css" />



    <div class="container">
                        <div class='col-md-5'>
                            <div class="form-group">
                                <div class="input-group date" id="datetimepicker7" data-target-input="nearest">
                                    <input type="text" class="form-control datetimepicker-input" data-target="#datetimepicker7"/>
                                    <div class="input-group-append" data-target="#datetimepicker7" data-toggle="datetimepicker">
                                        <div class="input-group-text"><i class="fa fa-calendar"></i></div>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class='col-md-5'>
                            <div class="form-group">
                                <div class="input-group date" id="datetimepicker8" data-target-input="nearest">
                                    <input type="text" class="form-control datetimepicker-input" data-target="#datetimepicker8"/>
                                    <div class="input-group-append" data-target="#datetimepicker8" data-toggle="datetimepicker">
                                        <div class="input-group-text"><i class="fa fa-calendar"></i></div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>





<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.27.0/moment.min.js" integrity="sha512-rmZcZsyhe0/MAjquhTgiUcb4d9knaFc7b5xAfju483gbEXTkeJRUMIPk6s3ySZMYUHEcjKbjLjyddGWMrNEvZg==" crossorigin="anonymous"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/tempusdominus-bootstrap-4/5.0.0-alpha14/js/tempusdominus-bootstrap-4.min.js"></script>

<script type="text/javascript">
                $(function () 
                    $('#datetimepicker7').datetimepicker(
                        format: 'DD-MM-YYYY',
                        minDate: moment.now(),
                    );
                    $('#datetimepicker8').datetimepicker(
                        useCurrent: false,
                        format: 'DD-MM-YYYY'
                    );
                    $("#datetimepicker7").on("change.datetimepicker", function (e) 
                        var addNewDay = moment(e.date, "DD-MM-YYYY").add(1, 'd').format('DD-MM-YYYY');
                        console.log(addNewDay);
                        $('#datetimepicker8').datetimepicker('minDate', addNewDay);
        
                    );
                    $("#datetimepicker8").on("change.datetimepicker", function (e) 
                        $('#datetimepicker7').datetimepicker('maxDate', e.date);
                    );
                );
            </script>

【讨论】:

您好,谢谢您的回复我想问我在哪里使用您发送的第一个代码?我应该把它放在离开的控制器或方法上,与 jaguar 一样,我应该将代码传递到哪里?我应该把它放在休假的创建视图中吗?【参考方案2】:

这是一个可以开发的想法,以便完成关于选择假期类型的 ajax 并返回假期的可用天数,然后您可以通过 datetimepicker 函数添加这个数字,我希望我成功了使我的想法更接近。谢谢。

    public function getUserLeave(Request $request)

    if ($request->ajax()) 
        $type = $request->type;
        $user_id = $request->user_id;

        $leaves = Leave::where('user_id', $user_id)->where('type', $type)->where(function ($q) 
            $date = Carbon::now();
            $q->where('from', '<=', date('Y-01-01', strtotime($date))); // 2020-01-01
            $q->where('to', '>=', date('Y-m-d', strtotime($date))); // 2020-08-27
        )->get();

        if (count($leaves) > 0) 
            $dateLeave = array();
            foreach ($leaves as $leave) 
                $leave_from = $leave->from;
                $leave_to = $leave->to;

                $diff = $leave_to->diff($leave_from)->format("%a");
                $dateLeave[] = $diff;

            

            $dateLeaveSum = array_sum($dateLeave);

            // add type of leave
            $annual_leave = 30;
            $sick_leave  = 5;

            if ($type === 'annual_leave')
                $value =   ($annual_leave - $dateLeaveSum);
                return response()->json($value);

            

            if ($type === 'sick_leave')
                $value =   ($sick_leave - $dateLeaveSum);
                return response()->json($value);

            

        
    

【讨论】:

这似乎确实非常接近我的想法,我将开始实施并测试它现在将返回它的运行方式只是想询问有关 ajax 我应该使用你在上面回答的那个在另一个答案?此外,该特定用户的总和保存在哪里?它是否存储在 users 表的 leaveBalance 属性中? 我认为最好为假期类型创建一个表格,其中包括根据您的指南所遵循的假期类型和假期持续时间,然后参考在这张表中。我认为这将使您以后的工作更轻松 如何将类型与用户联系起来,以便登录的特定用户拥有自己的年假和病假号码?【参考方案3】:

例如

public function up()
    
        Schema::create('types', function (Blueprint $table) 
            $table->id();
            $table->string('name')->unique();
            $table->string('days')->unsigned();
            $table->timestamps();
        );
    

在表的叶子中添加新的列名 type_id

$table->foreignId('type_id')->nullable()->constrained()->onDelete('cascade');

【讨论】:

以上是关于有没有办法在 Laravel 中取两个日期之间的数字并减去它的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法用两个日期之间的每小时日期时间有效地填充 python 中的 pandas df 列?

Laravel - 使用ajax获取两个日期之间的记录

如何在laravel项目中找到两个日期之间的结算金额

从 Laravel 中的日期列查询两个日期之间的数据

计算两个日期之间的年份 laravel

Laravel中两个日期之间的差异