2016-11-12 4 views
0

Название говорит все это, и вот кодLaravel 5.3. Диспетчерская работа имеет нечетную ошибку

Контроллер:

public function declineReservation($id){ 
     $reservation=Reservation::where('id',$id)->with('user','apartment')->get()->first(); 
     $this->dispatch(new SendMails($reservation)); 
     $reservation->delete(); 
     return redirect('reservations')->with('status', 'reservation declined'); 
} 

Работа:

<?php 

namespace App\Jobs; 

use App\Notifications\ReservationApproved; 
use App\Notifications\ReservationDeclined; 
use Illuminate\Bus\Queueable; 
use Illuminate\Contracts\Queue\ShouldQueue; 
use Illuminate\Queue\InteractsWithQueue; 
use Illuminate\Queue\SerializesModels; 

class SendMails implements ShouldQueue 
{ 
    use InteractsWithQueue, Queueable, SerializesModels; 

    protected $reservation; 

    /** 
    * Create a new job instance. 
    * 
    * @return void 
    */ 
    public function __construct($reservation) 
    { 
     $this->reservation=$reservation; 
    } 

    /** 
    * Execute the job. 
    * 
    * @return void 
    */ 
    public function handle() 
    { 
     $user=$this->reservation->user; 
     if($this->reservation->status==1){ 
      $user->notify(new ReservationApproved($this->reservation)); 
     } 
     else{ 
      $user->notify(new ReservationDeclined($this->reservation)); 
     } 
    } 
} 

И теперь приходит забавная часть. Оговорки в методе declineReservation имеют статус, равный 0, поэтому в работу ручки они идут к другому блоку, но почта не отправляется, если я не удалить

$reservation->delete(); 

от метода declineReservation.

Это мой первый вопрос в стеке, поэтому я надеюсь, что вы все будете готовы помочь в этой непостоянной проблеме.

ответ

0

После некоторого размышления я осознал, что после того, как задание запускается чуть позже после того, как syncronus удалит его, он не может удалить удаленную модель, поэтому вместо ее удаления я устанавливаю свою модель, чтобы она могла быть «мягкой», после выполнения задания (отправка почты) i удаление запись из базы данных.

Модель:

просто добавить этот

use SoftDeletes; 
protected $dates = ['deleted_at']; 

не забудьте импортировать SoftDeletes или использовать полный путь.

миграция:

добавить это к схеме строителю

$table->softDeletes(); 

Контроллер:

public function declineReservation($id){ 
    $reservation=Reservation::withTrashed()->where('id',$id)-with('user','apartment')->get()->first(); 
    $this->dispatch(new SendMails($id)); 
    $reservation->delete(); 
    return redirect('reservations')->with('status', 'reservation declined'); 
} 

Работа:

<?php 

namespace App\Jobs; 

use App\Notifications\ReservationApproved; 
use App\Notifications\ReservationDeclined; 
use App\Reservation; 
use Illuminate\Bus\Queueable; 
use Illuminate\Contracts\Queue\ShouldQueue; 
use Illuminate\Queue\InteractsWithQueue; 
use Illuminate\Queue\SerializesModels; 

class SendMails implements ShouldQueue 
{ 
use InteractsWithQueue, Queueable, SerializesModels; 

protected $param; 

/** 
* Create a new job instance. 
* 
* @return void 
*/ 
public function __construct($param) 
{ 
    $this->param=$param; 
} 

/** 
* Execute the job. 
* 
* @return void 
*/ 
public function handle() 
{ 
    if(is_object($this->param)){ 
     $user=$this->param->user; 
     $user->notify(new ReservationApproved($this->param)); 
    } 
    else{ 
     $reservation=Reservation::withTrashed()->where('id',$this->param)->get()->first(); 
     $reservation->user->notify(new ReservationDeclined($reservation)); 
     $reservation->forceDelete(); 
     } 
    } 
} 

В работе ручке я проверить если параметр является объектом, так как при бронировании i s утвержденная модель i для конструктора и при упадке передаю идентификатор модели, поэтому я могу загрузить его с помощью методаTrashed(). После этого просто «принудительно удалите» модель.

Для получения дополнительной информации о мягком удалении обратитесь к: https://laravel.com/docs/5.3/eloquent#soft-deleting

 Смежные вопросы

  • Нет связанных вопросов^_^