J'ai 2 tables
this 'accounts.transaction_amount_limit' should be `accounts`.`transaction_amount_limit`
donc chaque compte a un tas de transactions chaque jour ... je veux sélectionner le compte qui n'a pas atteint sa limite de transactions .... en cours la transaction pour chaque compte est stockée dans la table account_limits
En gros, je veux dire sélectionner un compte qui n'a pas de ligne account_limits ou qui n'a pas de account_limits mais qui n'a pas t atteint les limites account_limits.transaction_amount account_limits.transaction_count
quelque chose comme
where `account_limits`.`transaction_amount` < 'accounts.transaction_amount_limit'
J'ai ceci jusqu'à présent
where('account_limits.transaction_amount', '<', 'accounts.transaction_amount_limit')
comme @Flame l'a suggéré j'ai essayé
Account::whereHas('accountLimits', function($query) {
$query->where('account_limits.transaction_amount', '<', 'accounts.transaction_amount_limit')
->where('account_limits.transaction_count', '<', 'accounts.transaction_count_limit');
})->orHas('accountLimits', '=', 0);
le problème est pour une raison quelconque
$account = Account::where('disabled' , 0 )->where(function($q){
$q->whereDoesntHave('AccountLimit')->orWhere('....') ;
})->get();
dans la sortie se traduira par
select * from `accounts` ( where not exists (select * from `account_limits` where `accounts`.`id` = `account_limits`.`account_id`) OR where exists (select * from `account_limits` where `accounts`.`id` = `account_limits`.`account_id` && account_limits.transaction_amount < accounts.transaction_amount_limit && account_limits.transaction_count < accounts.transaction_count_limit) )
et la requête échoue, il y a un problème avec les citations p>
accounts : id , title , disabled , transaction_amount_limit , transaction_count_limit account_limits : id , account_id , transaction_amount , transaction_count , date
3 Réponses :
En tant que requête MySQL simple, quelque chose comme ceci devrait fonctionner:
SELECT a.*
FROM accounts a
JOIN limits l ON l.transaction_amount < a.transaction_amount_limit AND
l.transaction_count < a.transaction_count_limit
La condition JOIN filtrera tous les comptes qui ont atteint ou dépassé leur limites transaction_amount ou transaction_count .
merci je suis à la recherche de la syntaxe ORM, sinon ce serait le plan B
@hretic je sais. J'espère que vous obtiendrez un expert laravel qui vous montrera comment implémenter cette requête dans laravel.
Voici un exemple de réponse dans la syntaxe Eloquent. Notez que vous devez ajouter la relation:
Account::whereHas('accountLimits', function($query) {
$query->where('account_limits.transaction_amount', '<', 'accounts.transaction_amount_limit')
->where('account_limits.transaction_count', '<', 'accounts.transaction_count_limit');
})->orHas('accountLimits', '=', 0);
Et pour la requête:
// Account.php , your eloquent model
public function accountLimits()
{
return $this->hasMany(AccountLimit::class);
}
Ceci vérifie votre clause where dans la relation en utilisant whereHas , et si ce n'est pas une correspondance, il ajoutera également les enregistrements qui correspondent dans le orHas , qui trouve tous les comptes sans relations accountLimits.
y a-t-il une différence entre AccountLimit :: class et App \ AccountLimit dans le modèle lors de la définition de la relation?
votre chemin fonctionne presque, veuillez vérifier ma question en bas j'ai ajouté des informations supplémentaires
La définition est exactement la même, mais la définition de chaîne n'a pas d'assistance de code sur mon IDE, donc j'utilise toujours Model :: class . Il renvoie également une chaîne, c'est donc essentiellement la même chose.
merci, j'ai utilisé whereRaw pour gérer le problème des devis
C'est une bonne idée pour moi de conserver transaction_count et transaction_limit dans la même table (comptes). Ensuite, vous pouvez comparer ces colonnes.
$ accounts = Account :: whereRaw ("transaction_count
D'après ma lecture de votre question, il semble que les valeurs de
limitse trouvent dans la base de donnéesaccountset que les valeurs réelles se trouvent dans la base de donnéesaccount_limits? Est-ce correct?@Nick oui,
account_limitscontient les statistiques de transaction actuelles (montant, nombre) essentiellement après chaque transaction, je mets à jouraccount_limitset ajoute le nouveau montant de la transaction au tableauJe ne suis pas un expert en laravel mais je pourrais vous donner une requête MySQL simple si cela peut aider ...
@Nick, j'ai ajouté la requête aux demandes de réponse ignorent les erreurs de syntaxe
@hretic n'utilise tout simplement pas le nom de la table, juste la colonne à la place.