2
votes

Convertir la requête SQL à la manière Laravel (problème d'horodatage unix !!)

J'essaye de convertir cette requête SQL en requête Laravel.

Db::table('table1 as A')
->select('A.order_id')
->where('A.app_process', '=', '7')
->where('A.service_type', '=', 'lite') 
->orWhere('A.end_time', '>', '0')  <== problem here!!
->join(Db::raw('(select order_id from table2 where process = 1 and amount > 0 group by order_id) B'), 'B.order_id', '=', 'A.order_id')
->count();

J'ai presque réussi (?) à convertir mais je ne sais pas comment convertir la partie temporelle.

end_time - ". time ().") / 86400

ce que j'ai converti

SELECT count(*) FROM (SELECT order_id FROM table1 WHERE app_process='7' AND ( service_type='lite' OR ((end_time-".time().")/86400)>'0') ) a INNER JOIN (SELECT order_id FROM table2 WHERE process='1' AND amount>'0' GROUP BY order_id) b ON a.order_id=b.order_id

Quelqu'un pourrait-il m'aider à résoudre la partie temporelle?


8 commentaires

Qu'essayez-vous d'accomplir avec la partie temporelle? Il semble que cela puisse être beaucoup plus simple.


J'espère que cela vous sera utile. Question Stackoverflow


@Jerodev Je ne suis pas sûr car je ne suis pas celui qui a écrit la requête sql, mais le 'end_time' est un horodatage unix. Donc, je pense que ça pourrait prendre des jours maintenant à partir de la fin_heure.


@farooq Je suis désolé mais je ne trouve pas de choses utiles spécifiques là-bas ...


afficher votre format de fichier de fin de base de données?


@Sagor c'est un horodatage unix. Les valeurs telles que 1366800497.


@Jiwon avez-vous essayé time () ou laravel maintenant ()?


@Sagor a essayé les deux.


3 Réponses :


1
votes

Pour autant que je comprends la requête, elle vérifie simplement si end_time est dans le futur. Vous pouvez donc simplement faire ce qui suit:

->orWhere('A.end_time', '>', now())

now () est un assistant Laravel qui renvoie la date / heure actuelle.


1 commentaires

Le résultat est le même que zéro ... hmm ... peut-être que ma requête de conversion n'est pas correcte. Pouvez-vous regarder la requête dans son ensemble?



0
votes

essayez ceci, je pense que cela vous aide

Db::table('table1 as A')
->select('A.order_id')
->where([['A.app_process', '=', '7'],['A.service_type', '=', 'lite']])
->orWhere('A.end_time', '>', now())
->join(Db::raw('(select order_id from table2 where process = 1 and amount > 0 group by order_id) B'), 'B.order_id', '=', 'A.order_id')
->count();


5 commentaires

@Boymurodov vous voulez dire le 'end_time'? C'est un horodatage unix. Les valeurs telles que 1366800497. Le type de champ défini comme entier dans la table de base de données.


essayez cette classe de carbone $ time = Carbon :: createFromTimestamp ($ timestamp); $ timestamp est votre heure unix


Désolé, mais où puis-je essayer le "$ time"?


allez-vous convertir d'heure unix en date ou de date en unix


Je ne comprends pas ce que tu veux dire. Je veux juste obtenir les valeurs exactement la même valeur que la requête d'origine. Par exemple, 1413385199 (valeur end_time) moins 1566442100 (valeur temporelle) et diviser par 86400 est un 1771 négatif. Mais je ne sais pas comment puis-je soustraire la valeur time () dans la requête laravel.



1
votes

J'ai enfin trouvé la bonne requête. Il s'avère que le problème n'était pas seulement «time ()», mais aussi la mauvaise requête convertie. Je publie ceci pour aider quelqu'un.

Db::table('table1 as A')
->leftJoin('table2 as B', 'A.order_id', '=', 'B.order_id')
->where('A.app_process', '=', '7')
->where(function($query){
  $query->where('A.service_type', '=', 'lite')->orWhere('A.end_time', '>', time());
})
->where('B.process', '=', '1')
->where('B.amount', '>', '0')
->distinct()
->count('A.order_id');


0 commentaires