@@ -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)
141145implementation
142146
143147uses
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]);
268272end ;
269273
274+ // Исправленная процедура LoadRelation в TdGRelationalOpf
270275procedure TdGRelationalOpf.LoadRelation (AEntity: T3; const ARelationName: string);
271276var
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;
281287begin
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 ;
518552end ;
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+
520566procedure TdGRelationalEntityOpf.LoadAllRelations ;
521567var
522568 RelOpf: specialize TdGRelationalOpf<T1, T2, T3>;
@@ -529,11 +575,35 @@ procedure TdGRelationalEntityOpf.LoadAllRelations;
529575 end ;
530576end ;
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+
532590function TdGRelationalEntityOpf.GetRelatedObject (const ARelationName: string): TObject;
533591begin
534592 Result:=GetRelatedObject(FEntity, ARelationName);
535593end ;
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+
537607function TdGRelationalEntityOpf.GetRelatedObject (aEntity: T3; const ARelationName: string): TObject;
538608var
539609 RelOpf: specialize TdGRelationalOpf<T1, T2, T3>;
@@ -563,6 +633,18 @@ function TdGRelationalEntityOpf.GetRelatedObjectList(aEntity: T3; const ARelatio
563633 end ;
564634end ;
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
568650class function TdGRelatedObjectHelper.SafeCast (AObject: TObject): T;
0 commit comments