Laravel как добавить функцию из представления в контроллер (Business Logi c Layer) - PullRequest
2 голосов
/ 18 февраля 2020

В настоящее время у меня есть эта функция в моем представлении:

</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);
                $user->notify(new App\Notifications\TaksComplete);

                }
       @endphp
   </td>
</tr>

Я хотел бы знать, возможно ли добавить это в мой контроллер, чтобы мое представление только отображало результат.

Это мой контроллер:

<?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())->get();
        return view('SSL',['data'=>$data]);
    }
}

это моя модель:

<?php

namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\Model;

class sslModel extends Model
{
    use Notifiable;

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

Теперь проблема в том, что контроллер не знает таких вещей, как DateTime()

Функция выполняет следующие действия: если у пользователя есть что-то, что прошло после текущей даты, он отправит электронное письмо пользователю. Но теперь каждый раз, когда пользователь перезагружает страницу, он снова отправляет электронное письмо. Эта функция предназначена для остановки этого, но она не работает, на мой взгляд:

$SSL=App\sslModel::find(1);
$SSL->email_send = 1;
$SSL->save();

Это не меняет столбец email_send на 1 с 0 в таблице SSL в моей базе данных.

Можно ли добавить этот код в мой контроллер (или модель)? и чтобы столбец обновлялся в базе данных?

миграция моей пользовательской таблицы:

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Определите отношение к вашему User в вашем SslModel:

<?php

namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\Model;
use App\User;

class sslModel extends Model
{
    use Notifiable;

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

    protected $hidden = ['userID'];

    public function user() {
        return $this->belongsTo(User::class, "userID", "id");
    }
}

См .: laravel .com / docs / 6.x / eloquent-Relations # обновление-принадлежность-отношения

Напишите свой l oop в вашем контроллере

<?php

namespace App\Http\Controllers;

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

class sslController extends Controller
{
    public function SSL(){

        $models = \App\sslModel::where('userID', Auth::id())->get();

        foreach($models as $model) { 
             if ($model->EindDatum < Carbon::now() && $model->email_send == 0) {
                $model->update(['email_send' => 1]);
                $model->user()->first()->notify(new \App\Notifications\TaksComplete);
             }
        }


        return view('SSL',['data'=>$model]);
    }
}

Вид:

</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">
          @if($i->EindDatum < \Carbon::now())
              {{'Certificaat verlopen'}}
          @else
            {{'OK'}}
           @endif
       </td>
</tr>

См .: laravel .com / docs / master / blade # if-инструкции

[РЕДАКТИРОВАТЬ 1]

Или, если вы хотите сделать проверку фоновой обработки Laravel Планировщик: laravel .com / docs / master / scheduling

0 голосов
/ 19 февраля 2020

Исправлена ​​моя проблема .. Я просто изменил свой контроллер на:

public function SSL(){

        $data = DB::table('SSL')->where('userID', Auth::id())->get();
        $models = \App\sslModel::where('userID', Auth::id())->get();

        foreach($models as $model) { 
             if ($model->EindDatum < Carbon::now() && $model->email_send == 0) {
                DB::table('SSL')
                ->where('userID', Auth::id())
                ->where('EindDatum', '<', Carbon::now())
                ->update(['email_send' => 1]);
                $model->user()->first()->notify(new \App\Notifications\TaksComplete);
             }
        }


        return view('SSL',['data'=>$data]);
    }

...