Laravel 通知don';不要在队列上工作,而是直接工作

Laravel 通知don';不要在队列上工作,而是直接工作,laravel,laravel-5,queue,laravel-5.5,Laravel,Laravel 5,Queue,Laravel 5.5,我对laravel上的通知有一个问题,如果我在没有队列的情况下直接发送通知,那么这也会起作用 此通知需要发送电子邮件并保存在数据库中 我用这个调用notify作为例子 $user = \App\User::find(1); $candidato = \App\CandidatoVaga::where('id_user','=','1')->first(); $user->notify(new \App\Notifications\ConviteVagaCandidat

我对laravel上的通知有一个问题,如果我在没有队列的情况下直接发送通知,那么这也会起作用

此通知需要发送电子邮件并保存在数据库中

我用这个调用notify作为例子

$user = \App\User::find(1);
    $candidato = \App\CandidatoVaga::where('id_user','=','1')->first();
    $user->notify(new \App\Notifications\ConviteVagaCandidato($candidato));
这是\App\Notifications\ConviteVagaCandidato

<?php

namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
class ConviteVagaCandidato extends Notification implements ShouldQueue
{
use Queueable;
protected $CandidatoVaga;
/**
 * Create a new notification instance.
 *
 * @return void
 */
public function __construct(\App\CandidatoVaga $CandidatoVaga)
{
    $this->CandidatoVaga = $CandidatoVaga;
}
/**
 * Get the notification's delivery channels.
 *
 * @param  mixed  $notifiable
 * @return array
 */
public function via($notifiable)
{
    return ['database','mail'];
}

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\MailMessage
 */
public function toMail($notifiable)
{
    return (new MailMessage)
    ->greeting('Olá, '.$this->CandidatoVaga->user->DadosPessoais->nome)
    ->subject('Convite')
    ->markdown('email.convite_selecao');
}
/**
 * Get the array representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return array
 */
public function toArray($notifiable)
{
return [
        'id_vaga' => $this->CandidatoVaga->id_vaga,
        'id_user' => $this->CandidatoVaga->id_user,
        'mensagem' => 'Você foi pré selecionado para a vaga',
        'tipo' => 'Nova Vaga',
    ];
}
}

我能够以缓和的方式解决它

public $id_vaga;
public $id_user;
public $nome;
public $titulo_vaga;
/**
 * Create a new notification instance.
 *
 * @return void
 */
public function __construct($CandidatoVaga)
{

    $this->id_vaga = $CandidatoVaga->id_vaga;
    $this->id_user = $CandidatoVaga->id_user;
    $this->nome = $CandidatoVaga->user->DadosPessoais->nome;
    $this->titulo_vaga = $CandidatoVaga->vaga->titulo_vaga;
}

我能以缓和的方式解决它

public $id_vaga;
public $id_user;
public $nome;
public $titulo_vaga;
/**
 * Create a new notification instance.
 *
 * @return void
 */
public function __construct($CandidatoVaga)
{

    $this->id_vaga = $CandidatoVaga->id_vaga;
    $this->id_user = $CandidatoVaga->id_user;
    $this->nome = $CandidatoVaga->user->DadosPessoais->nome;
    $this->titulo_vaga = $CandidatoVaga->vaga->titulo_vaga;
}

sync
队列驱动程序和实际队列驱动程序之间的区别之一是排队作业处理存储模型的方式

由于
sync
队列驱动程序直接在同一进程中处理作业,因此没有额外的工作要做。如果使用
模型构建
通知
,它将使用该模型实例

但是,在使用实际队列时,Laravel必须序列化存储在通知上的数据,以便队列工作者处理它。因为模型不容易序列化,所以它实际上只是将模型密钥存储在通知上,然后当队列工作者处理该作业时,它使用存储的密钥从数据库中重新检索该模型

根据您在评论中提到的查询,我认为您的
\App\candidateovga
型号没有主键(
$primaryKey
为空)。因此,没有要查询的主键字段(
“Candidateos_vaga.”“
),也没有存储主键值(
为null

我看你已经为自己想出了一个解决办法。但是,如果您仍想尝试仅使用模型,则可以尝试以下操作:

  • 覆盖模型上的
    getQueueableId()
    方法。默认情况下,这将返回主键字段。但是,由于没有定义一个,因此需要重写此方法,以提供一些可用于再次查找记录的唯一数据

  • 在模型上重写
    newQueryForRestoration()
    方法。默认情况下,这将使用主键字段生成查询。但是,由于没有定义查询,因此需要重写此方法以使用
    getQueueableId()
    方法生成的数据生成查询


  • 注:这是未经测试的。我从来没有这样做过;这正是我在源代码中看到的。

    队列驱动程序与实际队列驱动程序之间的区别之一是排队作业处理存储模型的方式

    由于
    sync
    队列驱动程序直接在同一进程中处理作业,因此没有额外的工作要做。如果使用
    模型构建
    通知
    ,它将使用该模型实例

    但是,在使用实际队列时,Laravel必须序列化存储在通知上的数据,以便队列工作者处理它。因为模型不容易序列化,所以它实际上只是将模型密钥存储在通知上,然后当队列工作者处理该作业时,它使用存储的密钥从数据库中重新检索该模型

    根据您在评论中提到的查询,我认为您的
    \App\candidateovga
    型号没有主键(
    $primaryKey
    为空)。因此,没有要查询的主键字段(
    “Candidateos_vaga.”“
    ),也没有存储主键值(
    为null

    我看你已经为自己想出了一个解决办法。但是,如果您仍想尝试仅使用模型,则可以尝试以下操作:

  • 覆盖模型上的
    getQueueableId()
    方法。默认情况下,这将返回主键字段。但是,由于没有定义一个,因此需要重写此方法,以提供一些可用于再次查找记录的唯一数据

  • 在模型上重写
    newQueryForRestoration()
    方法。默认情况下,这将使用主键字段生成查询。但是,由于没有定义查询,因此需要重写此方法以使用
    getQueueableId()
    方法生成的数据生成查询


  • 注:这是未经测试的。我从来没有这样做过;这正是我在源代码中看到的。

    什么是sql错误?SQLSTATE[42601]:语法错误:7错误:分隔标识符在“”行1:…*内或附近的大小为零来自“Candidateos_vaga”,其中“Candidateos_vaga.”为空…^(SQL:从“CandidateTos_vaga”中选择*,其中“CandidateTos_vaga”。“为空限制1)尝试记录
    $this->CandidateToVaga
    ,并在laravel中检查它。logI我认为这是问题所在,我删除了所有$this->CandidateToVaga并开始工作,但我做错了什么?也许模型没有正确加载模型,以前遇到过序列化问题。sql错误是什么?SQLSTATE[42601]:语法错误:7错误:分隔标识符在“”行1:…*内或附近大小为零来自“Candidateos_vaga”,其中“Candidateos_vaga.”为空…^(SQL:从“CandidateTos_vaga”中选择*,其中“CandidateTos_vaga”。“为空限制1)尝试记录
    $this->CandidateToVaga
    ,并在laravel中检查它。logI我认为这是问题所在,我删除了所有$this->CandidateToVaga并开始工作,但我做错了什么?也许模型没有正确加载模型,以前在序列化问题上遇到过问题。在此模式下,我可以使用composte主键,如果我设置为model,我将解决此问题?@GuilhermeFreire否,Laravel的Elount不支持复合主键。在此模式下,我可以使用composte主键,如果我设置为model,我将解决此问题?@GuilhermeFreire否,Laravel的eloquent不支持复合主键。