Skip to content

Commit ea6bcd0

Browse files
committed
update
1 parent 216d3d6 commit ea6bcd0

3 files changed

Lines changed: 135 additions & 48 deletions

File tree

core/dopfrelations.pas

Lines changed: 94 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -122,11 +122,15 @@ generic TdGRelationalEntityOpf<T1, T2; T3: TObject> = class(specialize TdGEnti
122122
function GetRelationalEntity: IdRelationalEntity;
123123
public
124124
procedure LoadRelation(const ARelationName: string);
125+
procedure LoadRelationForEntity(AEntity: T3; const ARelationName: string);
125126
procedure LoadAllRelations;
127+
procedure LoadAllRelationsForEntity(AEntity: T3);
126128
function GetRelatedObject(const ARelationName: string): TObject;
127-
function GetRelatedObject(aEntity: T3; const ARelationName: string): TObject;
129+
function GetRelatedObject(aEntity: T3; const ARelationName: string): TObject;
130+
function GetRelatedObjectForEntity(AEntity: T3; const ARelationName: string): TObject;
128131
function GetRelatedObjectList(const ARelationName: string): TObjectList;
129132
function GetRelatedObjectList(aEntity: T3; const ARelationName: string): TObjectList;
133+
function GetRelatedObjectListForEntity(AEntity: T3; const ARelationName: string): TObjectList;
130134
procedure SaveWithRelations;
131135
end;
132136

@@ -141,7 +145,7 @@ generic TdGRelatedObjectHelper<T: class> = class(TdObject)
141145
implementation
142146

143147
uses
144-
TypInfo, Variants, dOpfTableRegistry
148+
TypInfo, Variants, dOpfTableRegistry, DB
145149
;
146150

147151
{ TdRelationInfo }
@@ -267,6 +271,7 @@ function TdGRelationalOpf.GetRelationalEntity(AEntity: T3): IdRelationalEntity;
267271
raise EdOpf.CreateFmt('Entity "%s" does not support relations', [AEntity.ClassName]);
268272
end;
269273

274+
// Исправленная процедура LoadRelation в TdGRelationalOpf
270275
procedure TdGRelationalOpf.LoadRelation(AEntity: T3; const ARelationName: string);
271276
var
272277
RelEntity: IdRelationalEntity;
@@ -278,6 +283,7 @@ procedure TdGRelationalOpf.LoadRelation(AEntity: T3; const ARelationName: string
278283
RelatedObj: TObject;
279284
RelatedList: TObjectList;
280285
TargetTableName: string;
286+
aLocalKeyValue: Integer;
281287
begin
282288
if not IsRelationalEntity(AEntity) then
283289
raise EdOpf.CreateFmt('Entity "%s" does not support relations', [AEntity.ClassName]);
@@ -305,47 +311,72 @@ procedure TdGRelationalOpf.LoadRelation(AEntity: T3; const ARelationName: string
305311
raise EdOpf.CreateFmt('Local key property "%s" not found', [RelInfo.LocalKey]);
306312

307313
LocalKeyValue := GetVariantProp(AEntity, LocalKeyProp);
314+
aLocalKeyValue:=Integer(LocalKeyValue);
315+
316+
WriteLn('DEBUG: Loading relation "', ARelationName, '" for entity ', AEntity.ClassName);
317+
WriteLn('DEBUG: Target table: ', TargetTableName);
318+
WriteLn('DEBUG: Local key value: ', VarToStr(LocalKeyValue));
319+
WriteLn('DEBUG: Foreign key: ', RelInfo.ForeignKey);
320+
WriteLn('DEBUG: Relation type: ', Ord(RelInfo.RelationType));
308321

309322
// Create temporary query for loading related data
310323
TempQuery := T2.Create(FConnection);
311324
try
312325
case RelInfo.RelationType of
313326
rtOneToOne, rtManyToOne:
314327
begin
315-
// SELECT * FROM target_table WHERE foreign_key = :local_value
316-
SQL := Format('SELECT * FROM %s WHERE %s = :local_value',
328+
// ИСПРАВЛЕНО: правильный SQL-запрос для отношений
329+
// Для rtOneToOne и rtManyToOne используем foreign_key для поиска
330+
SQL := Format('SELECT * FROM %s WHERE %s = :param1',
317331
[TargetTableName, RelInfo.ForeignKey]);
318332
TempQuery.SQL.Text := SQL;
319-
TempQuery.Param('local_value').Value := LocalKeyValue;
333+
TempQuery.SQL.Add('ORDER BY id LIMIT 1'); // Для OneToOne берем только первую запись
334+
335+
// Добавляем параметр
336+
TempQuery.Params.ParamByName('param1').Value:=LocalKeyValue;
337+
338+
WriteLn('DEBUG: SQL: ', TempQuery.SQL.Text);
339+
WriteLn('DEBUG: Param value: ', VarToStr(LocalKeyValue));
340+
320341
TempQuery.Open;
321342

322343
if not TempQuery.IsEmpty then
323344
begin
324345
RelatedObj := RelInfo.TargetClass.Create;
325346
TempQuery.GetFields(RelatedObj);
326347
RelEntity.SetRelationValue(ARelationName, RelatedObj);
327-
end;
348+
WriteLn('DEBUG: Found related object');
349+
end
350+
else
351+
WriteLn('DEBUG: No related objects found');
328352
end;
329353

330354
rtOneToMany:
331355
begin
332356
// SELECT * FROM target_table WHERE foreign_key = :local_value
333-
SQL := Format('SELECT * FROM %s WHERE %s = :local_value',
357+
SQL := Format('SELECT * FROM %s WHERE %s = :param1',
334358
[TargetTableName, RelInfo.ForeignKey]);
335359
TempQuery.SQL.Text := SQL;
336-
TempQuery.Param('local_value').Value := LocalKeyValue;
360+
361+
// Добавляем параметр
362+
TempQuery.Params.ParamByName('param1').Value:=LocalKeyValue;
363+
364+
WriteLn('DEBUG: SQL: ', TempQuery.SQL.Text);
365+
337366
TempQuery.Open;
338367

339-
RelatedList := TObjectList.Create;
368+
RelatedList := TObjectList.Create(True); // OwnsObjects = True
340369
TempQuery.First;
341370
while not TempQuery.EOF do
342371
begin
343372
RelatedObj := RelInfo.TargetClass.Create;
344373
TempQuery.GetFields(RelatedObj);
345374
RelatedList.Add(RelatedObj);
375+
WriteLn('DEBUG: Added related object to list');
346376
TempQuery.Next;
347377
end;
348378
RelEntity.SetRelationValue(ARelationName, RelatedList);
379+
WriteLn('DEBUG: Found ', RelatedList.Count, ' related objects');
349380
end;
350381

351382
rtManyToMany:
@@ -354,15 +385,18 @@ procedure TdGRelationalOpf.LoadRelation(AEntity: T3; const ARelationName: string
354385
// JOIN mapping_table m ON t.id = m.target_id
355386
// WHERE m.local_id = :local_value
356387
SQL := Format(
357-
'SELECT t.* FROM %s t JOIN %s m ON t.%s = m.%s_target WHERE m.%s_local = :local_value',
388+
'SELECT t.* FROM %s t JOIN %s m ON t.%s = m.%s_target WHERE m.%s_local = :param1',
358389
[TargetTableName, RelInfo.MappingTable,
359390
RelInfo.LocalKey, RelInfo.ForeignKey,
360391
RelInfo.LocalKey]);
361392
TempQuery.SQL.Text := SQL;
362-
TempQuery.Param('local_value').Value := LocalKeyValue;
393+
394+
// Добавляем параметр
395+
TempQuery.Params.ParamByName('param1').Value:=LocalKeyValue;
396+
363397
TempQuery.Open;
364398

365-
RelatedList := TObjectList.Create;
399+
RelatedList := TObjectList.Create(True);
366400
TempQuery.First;
367401
while not TempQuery.EOF do
368402
begin
@@ -517,6 +551,18 @@ procedure TdGRelationalEntityOpf.LoadRelation(const ARelationName: string);
517551
end;
518552
end;
519553

554+
procedure TdGRelationalEntityOpf.LoadRelationForEntity(AEntity: T3; const ARelationName: string);
555+
var
556+
RelOpf: specialize TdGRelationalOpf<T1, T2, T3>;
557+
begin
558+
RelOpf := specialize TdGRelationalOpf<T1, T2, T3>.Create(FConnection, FTable.Name);
559+
try
560+
RelOpf.LoadRelation(AEntity, ARelationName);
561+
finally
562+
RelOpf.Free;
563+
end;
564+
end;
565+
520566
procedure TdGRelationalEntityOpf.LoadAllRelations;
521567
var
522568
RelOpf: specialize TdGRelationalOpf<T1, T2, T3>;
@@ -529,11 +575,35 @@ procedure TdGRelationalEntityOpf.LoadAllRelations;
529575
end;
530576
end;
531577

578+
procedure TdGRelationalEntityOpf.LoadAllRelationsForEntity(AEntity: T3);
579+
var
580+
RelOpf: specialize TdGRelationalOpf<T1, T2, T3>;
581+
begin
582+
RelOpf := specialize TdGRelationalOpf<T1, T2, T3>.Create(FConnection, FTable.Name);
583+
try
584+
RelOpf.LoadAllRelations(AEntity);
585+
finally
586+
RelOpf.Free;
587+
end;
588+
end;
589+
532590
function TdGRelationalEntityOpf.GetRelatedObject(const ARelationName: string): TObject;
533591
begin
534592
Result:=GetRelatedObject(FEntity, ARelationName);
535593
end;
536594

595+
function TdGRelationalEntityOpf.GetRelatedObjectForEntity(AEntity: T3; const ARelationName: string): TObject;
596+
var
597+
RelOpf: specialize TdGRelationalOpf<T1, T2, T3>;
598+
begin
599+
RelOpf := specialize TdGRelationalOpf<T1, T2, T3>.Create(FConnection, FTable.Name);
600+
try
601+
Result := RelOpf.GetRelatedObject(AEntity, ARelationName);
602+
finally
603+
RelOpf.Free;
604+
end;
605+
end;
606+
537607
function TdGRelationalEntityOpf.GetRelatedObject(aEntity: T3; const ARelationName: string): TObject;
538608
var
539609
RelOpf: specialize TdGRelationalOpf<T1, T2, T3>;
@@ -563,6 +633,18 @@ function TdGRelationalEntityOpf.GetRelatedObjectList(aEntity: T3; const ARelatio
563633
end;
564634
end;
565635

636+
function TdGRelationalEntityOpf.GetRelatedObjectListForEntity(AEntity: T3; const ARelationName: string): TObjectList;
637+
var
638+
RelOpf: specialize TdGRelationalOpf<T1, T2, T3>;
639+
begin
640+
RelOpf := specialize TdGRelationalOpf<T1, T2, T3>.Create(FConnection, FTable.Name);
641+
try
642+
Result := RelOpf.GetRelatedObjectList(AEntity, ARelationName);
643+
finally
644+
RelOpf.Free;
645+
end;
646+
end;
647+
566648
{ TdGRelatedObjectHelper }
567649

568650
class function TdGRelatedObjectHelper.SafeCast(AObject: TObject): T;

0 commit comments

Comments
 (0)