Domanda

Dottrina , sto cercando di eliminare i record in una singola tabella sulla base dei dati raccolti da più tabelle.

'companies_groups' è una tabella di associazione che collega a 'gruppi' 'delle aziende. Voglio eliminare tutti i record in questa tabella collegata ad una società specifica, con la restrizione che solo i record 'companies_groups' legate a un gruppo di 'pubblico' verranno eliminati.

Se dovessi scrivere questo in puro SQL, che sarebbe simile a questa:

DELETE companies_groups
FROM companies_groups, groups
WHERE companies_groups.companyID = 7
AND companies_groups.groupID = groups.id
AND groups.groupType = 'public'

Qual è l'equivalente in dottrina? Ho lottato e sperimentare per un'ora o così ora.

Al momento ho questa:

$query = Doctrine_Query::create()
  ->delete('Company_group cg')
  ->from('Company_group cg, Group g')
  ->where( "cg.companyID = ? AND g.groupType = 'public' AND g.id = cg.groupID ", array( $companyID ) );

(I miei modelli sono Dottrina 'Company_group' per la tavola il 'companies_groups' e 'gruppo' per la tabella 'gruppi')

che produce questo SQL:

DELETE FROM companies_groups, groups WHERE (companyid = ? AND grouptype = 'public' AND id = groupid)

Si può vedere che il codice SQL generato manca 'companies_groups' tra DELETE e FROM, e che le qualificazioni vengono eliminati (che significa 'id' sarà ambiguo).

Fatemi sapere se c'è qualsiasi informazioni posso fornire che sarebbe utile.

È stato utile?

Soluzione

Risolto esso. Piuttosto che cercare di costruire il join me stesso ho usato una sottoquery e non hanno cercato di forzare Dottrina per la costruzione della SQL in modo specifico.

Per chiunque altro che mai ha bisogno di fare qualcosa di simile, qui è quello che ha finito per lavorare:

$query = Doctrine_Query::create()
  ->delete('Company_group')
  ->where( "companyID = ?", array( $companyID ) )
  ->addWhere( "groupID IN (SELECT g.id FROM Group g WHERE g.groupType = 'public')" );

Saluti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top