1
votes

relation de requête basée sur la colonne parente

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 


5 commentaires

D'après ma lecture de votre question, il semble que les valeurs de limit se trouvent dans la base de données accounts et que les valeurs réelles se trouvent dans la base de données account_limits ? Est-ce correct?


@Nick oui, account_limits contient les statistiques de transaction actuelles (montant, nombre) essentiellement après chaque transaction, je mets à jour account_limits et ajoute le nouveau montant de la transaction au tableau


Je 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.


3 Réponses :


0
votes

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 .


2 commentaires

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.



1
votes

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.


4 commentaires

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



0
votes

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 get ();


0 commentaires