66import java .lang .reflect .Field ;
77import java .lang .reflect .InvocationTargetException ;
88import java .lang .reflect .Method ;
9+ import java .security .InvalidParameterException ;
910import java .util .ArrayList ;
1011import java .util .HashMap ;
1112import java .util .List ;
@@ -165,26 +166,40 @@ public <T extends Model> Query<T> belongsTo(Class<T> parent) {
165166 }
166167
167168 public <T extends Model > Query <T > belongsTo (Class <T > parent , String fieldName ) {
169+ return belongsTo (parent , fieldName , Repo .get (parent ).getInfo ().getIdField ());
170+ }
171+
172+ public <T extends Model > Query <T > belongsTo (Class <T > parent , String fieldName , String otherFieldName ) {
168173 try {
169174 Object id = Repo .get (getClass ()).getInfo ().getField (fieldName ).get (this );
170- return Repo .get (parent ).whereId ( id );
175+ return Repo .get (parent ).where ( otherFieldName , id );
171176 } catch (IllegalAccessException e ) {
172177 throw new RuntimeException (e );
173178 }
174179 }
175180
181+ public <T extends Model > void assignTo (T value ) {
182+ if (value == null )
183+ throw new InvalidParameterException ("You need to specify a parent type if the value is null" );
184+ assignTo ((Class <T >) value .getClass (), value );
185+ }
186+
176187 public <T extends Model > void assignTo (Class <T > parent , T value ) {
177188 assignTo (parent , value , Repo .get (parent ).getInfo ().getRelationField ());
178189 }
179190
180191 public <T extends Model > void assignTo (Class <T > parent , T value , String fieldName ) {
192+ assignTo (parent , value , fieldName , Repo .get (parent ).getInfo ().getIdField ());
193+ }
194+
195+ public <T extends Model > void assignTo (Class <T > parent , T value , String fieldName , String otherFieldName ) {
181196 try {
182197 Field f = Repo .get (getClass ()).getInfo ().getField (fieldName );
183198 if (value == null ) {
184199 f .set (this , null );
185200 } else {
186201 Repo <T > repo = Repo .get (parent );
187- Object id = repo .getInfo ().getField (repo . getInfo (). getIdField () ).get (value );
202+ Object id = repo .getInfo ().getField (otherFieldName ).get (value );
188203 f .set (this , id );
189204 }
190205 } catch (IllegalAccessException e ) {
@@ -197,9 +212,13 @@ public <T extends Model> Query<T> hasMany(Class<T> child) {
197212 }
198213
199214 public <T extends Model > Query <T > hasMany (Class <T > child , String fieldName ) {
215+ return hasMany (child , fieldName , Repo .get (getClass ()).getInfo ().getIdField ());
216+ }
217+
218+ public <T extends Model > Query <T > hasMany (Class <T > child , String fieldName , String ownFieldName ) {
200219 try {
201220 Repo <?> ownRepo = Repo .get (getClass ());
202- Object id = ownRepo .getInfo ().getField (ownRepo . getInfo (). getIdField () ).get (this );
221+ Object id = ownRepo .getInfo ().getField (ownFieldName ).get (this );
203222 return Repo .get (child ).where (fieldName , id );
204223 } catch (IllegalAccessException e ) {
205224 throw new RuntimeException (e );
@@ -214,17 +233,25 @@ public <T extends Model, P extends Model> Query<T> belongsToMany(Class<T> other,
214233 return belongsToMany (other , pivot , Repo .get (getClass ()).getInfo ().getRelationField (), Repo .get (other ).getInfo ().getRelationField (), pivotFilter );
215234 }
216235
217- public <T extends Model , P extends Model > Query <T > belongsToMany (Class <T > other , Class <P > pivot , String selfFieldName , String otherFieldName ) {
218- return belongsToMany (other , pivot , selfFieldName , otherFieldName , null );
236+ public <T extends Model , P extends Model > Query <T > belongsToMany (Class <T > other , Class <P > pivot , String selfPivotFieldName , String otherPivotFieldName ) {
237+ return belongsToMany (other , pivot , selfPivotFieldName , otherPivotFieldName , null );
238+ }
239+
240+ public <T extends Model , P extends Model > Query <T > belongsToMany (Class <T > other , Class <P > pivot , String selfPivotFieldName , String otherPivotFieldName , Function <Query <P >, Query <P >> pivotFilter ) {
241+ return belongsToMany (other , pivot , selfPivotFieldName , otherPivotFieldName , Repo .get (getClass ()).getInfo ().getIdField (), Repo .get (other ).getInfo ().getIdField (), pivotFilter );
219242 }
220243
221- public <T extends Model , P extends Model > Query <T > belongsToMany (Class <T > other , Class <P > pivot , String selfFieldName , String otherFieldName , Function <Query <P >, Query <P >> pivotFilter ) {
244+ public <T extends Model , P extends Model > Query <T > belongsToMany (Class <T > other , Class <P > pivot , String selfPivotFieldName , String otherPivotFieldName , String selfFieldName , String otherFieldName ) {
245+ return belongsToMany (other , pivot , selfPivotFieldName , otherPivotFieldName , selfFieldName , otherFieldName , null );
246+ }
247+
248+ public <T extends Model , P extends Model > Query <T > belongsToMany (Class <T > other , Class <P > pivot , String selfPivotFieldName , String otherPivotFieldName , String selfFieldName , String otherFieldName , Function <Query <P >, Query <P >> pivotFilter ) {
222249 try {
223250 Repo <?> selfRepo = Repo .get (getClass ());
224251 Repo <T > otherRepo = Repo .get (other );
225- Object id = selfRepo .getInfo ().getField (selfRepo . getInfo (). getIdField () ).get (this );
252+ Object id = selfRepo .getInfo ().getField (selfFieldName ).get (this );
226253 return otherRepo .whereExists (pivot , q -> {
227- q .where (pivot , selfFieldName , "=" , id ).where (pivot , otherFieldName , "=" , other , otherRepo . getInfo (). getIdColumn () );
254+ q .where (pivot , selfPivotFieldName , "=" , id ).where (pivot , otherPivotFieldName , "=" , other , otherFieldName );
228255 if (pivotFilter != null )
229256 q = pivotFilter .apply (q );
230257 return q ;
@@ -234,17 +261,4 @@ public <T extends Model, P extends Model> Query<T> belongsToMany(Class<T> other,
234261 }
235262 }
236263
237- public void setMorph (String name , Class <? extends Model > type , Object id ) {
238- TableInfo info = Repo .get (getClass ()).getInfo ();
239- try {
240- info .getField (name + "Id" ).set (this , id );
241- info .getField (name + "Type" ).set (this , Repo .get (type ).getInfo ().getMorphType ());
242- } catch (IllegalAccessException ignored ) {
243- }
244- }
245-
246- public void setMorph (String name , Model model ) {
247- setMorph (name , model .getClass (), Repo .get (model .getClass ()).getId (model ));
248- }
249-
250264}
0 commit comments