如何使用 Laravel 使用视图中的函数更新数据库中的列

Posted

技术标签:

【中文标题】如何使用 Laravel 使用视图中的函数更新数据库中的列【英文标题】:How to update column in a database with a function in a view using Laravel 【发布时间】:2020-06-02 04:15:19 【问题描述】:

我目前正在做一个项目,如果某个日期是过去的。用户应该会收到一封电子邮件,通知他们当前的“合同”已完成。现在我已经构建了功能,如果日期是过去,用户会收到电子邮件,但问题是每次用户重新加载页面时它会再次发送电子邮件。现在我在我的表中添加了一个名为 email_send 的列,默认值为 0,但是当函数发送电子邮件时,它似乎没有从 0 更新到 1?

这是我的 sslController.php


namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;

class sslController extends Controller

    function SSL()
        $data = DB::table('SSL')->where('userID', Auth::id())
        ->join('users', 'users.id', '=', 'SSL.userID')->get();
        return view('SSL',['data'=>$data]);
    

注意join是为了让登录的用户在表中只能看到自己的数据

这是 sslModel.php:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class sslModel extends Model

    protected $table='SSL';
    protected $fillable = [
         'email_send',
    ];

这是我的 ssl.blade.php 的一部分:

</tr>
    @foreach ($data as $i )
       <tr>
         <td>
           $i->AanvraagID
         </td>
         <td>
           $i->Status
         </td>
         <td>
           $i->StartDatum
         </td>
         <td>
           $i->EindDatum
         </td>
         <td>
           $i->Leverancier
         </td>
         <td>
           $i->Product
         </td>
         <td>
           $i->Validatie
         </td>
         <td>
           $i->TypeCertificaat
         </td>
         <td class="wrong">
             @php  
                $date = new DateTime($i->EindDatum);
                $now = new DateTime();

                if($date < $now)  echo  'Certificaat verlopen';

                if ($date < $now && $i->email_send == 0) 
                $user = App\User::find(1)->first();
                $user->notify(new App\Notifications\TaksComplete);
                $user->update(['email_send' => 1]);
                
              @endphp
           </td>
     </tr>

我也试过这个:

if ($date < $now && $i->email_send == 0)        

$user=App\User::find(1);
$user->notify(new App\Notifications\TaksComplete);                                                            $SSL=App\sslModel::find(1);
$SSL->email_send=1;
$SSL->update();

【问题讨论】:

我认为您最好在控制器中执行逻辑并将结果返回给视图。 知道如何在我的控制器中实现这个逻辑吗? 应该在视图显示的时候触发更新? 是的.. 除非日期还没有过去。 所以你可以将你的逻辑从视图移动到你的sslController 【参考方案1】:

如果你正在使用 find() 函数,那么不要使用 first()

$user=App\User::find(1);
$user->email_send=1;
$user->update();

如果 App\User 不工作 然后 使用 App\Models\User;

$user=User::find(1);
$user->email_send=1;
$user->update();

用于更新 sslModel

$sslModel=App\sslModel::where('userID', Auth::id())->first();
$sslModel->email_send=1;
$sslModel->update();

【讨论】:

这不起作用,它会尝试更新我在用户表中的 email_send 却不存在 Column not found: 1054 Unknown column 'email_send' in 'field list' (SQL: update users set email_send = 1, users.updated_at = 2020-02-18 08:11:42 其中id = 1) 问题是它试图在我的用户表中更新,但它应该在 SSL 表中更新!

以上是关于如何使用 Laravel 使用视图中的函数更新数据库中的列的主要内容,如果未能解决你的问题,请参考以下文章

关于 Laravel - 如何在视图中使用函数字符串

ajax 请求控制器更新 laravel 中的视图

如何更新 laravel 中的数据?

PHP Laravel 在所有视图中使用辅助类

使用 laravel,我如何创建一个将更新一对多关系的视图?

如何使用 Laravel 框架更新 MySQL 中的 json 数据?