0

Bitte meine Klassenkonstruktors betrachten:Clone und Kette Problem in Laravel Query Builder und Warteschlangen

public function __construct(User $query = null) 
{ 
    $this->query = $query ?: (new User())->getQuery(); 
} 

Ich habe eine Methode wie folgt aus:

public function getNullActivityUsers() 
{ 
    $query = clone $this->query; 

    $query->whereNull('activity'); 

    return $query->get(); 
} 

Wenn ich diese Methode aufrufen, die SQL-Abfrage wird dies:

select * from `users` where `activity` is null 

Aber wenn ich schiebe diese Methode in Laravel Warteschlange, wird die Abfrage sein:

select * from `users` 

In der Tat wäre das Verkettungsverfahren von whereNull nicht in dieser Methode aufgerufen werden. Ich sollte das Verfahren auf diese Version ändern:

public function getNullActivityUsers() 
{ 
    $query = clone $this->query; 

    $query = $query->whereNull('activity'); 

    return $query->get(); 
} 

Dies wird den Trick: $ query = $ query-> whereNull ('Aktivität');

Aber ich möchte wissen, warum Laravel in diesem Fall anders verhält. Wenn ich die Methode außerhalb der Warteschlange teste, ist die Verkettung vorhanden. Aber wenn ich die Throw Queue starte, wird es andere Ergebnisse bekommen.

((Stellen Sie sich vor, dass ich immer, dass clone verwenden sollte.))

+0

Versuchen Sie in der gleichen Zeit zu verketten und zurückzukehren: 'return $ query-> whereNull ('activity') -> get();' !! – Maraboc

+0

Ich weiß !! Aber stell dir vor, dass ich das auf diese Weise machen will. In der Tat möchte ich über die verschiedenen Ergebnisse von Laravel wissen. – MisaGH

Antwort

0

Ich habe es nicht getestet, und wenn es so funktioniert hat würde ich sagen, dass es ein Fehler ist.

Aber das Wichtigste ist - haben Sie gestoppt/neu gestartet Warteschlange vor der Überprüfung, was geht man? Sie könnten in diesem Fall falsch-positiv werden, weil die Warteschlange den alten Code verwendet. Jedes Mal, wenn Sie Änderungen an Ihrem Code vornehmen, sollten Sie den Warteschlangen-Worker neu starten, um sicherzustellen, dass die Änderungen in Ihrem Code angezeigt werden. Siehe Abschnitt Queue workers and deployment, wenn dies der Fall ist.

+0

Ja Ich habe die Warteschlange neu gestartet und viele Male getestet. – MisaGH

+0

@MisaGH Können Sie zeigen, wie genau Sie "diese Methode" in die Warteschlange schieben? –

+0

Damit setze ich eine Prozessmethode ein und bei dieser Methode habe ich die obige Methode aufgerufen. 'Queue :: push (static :: class. '@process', [], 'normal');' – MisaGH