Page 1 of 1
Before adding a relationship to a relational table
Posted:
Wed Nov 02, 2011 6:45 am
by umair
Hello Xataface universe
I am hoping you guys can help me out with a problem.
I have 3 tables as follows with their relationships
Student
Class.ClassID = student_class.ClassID
student_class.StudentID = "$StudentID"
Class
Student.StudentID = student_class.StudentID
student_class.ClassID = "$classID"
student_class (relational table)
This is what I need to do, before a user adds a relation between a student and class, I want to perform a validation on one of the fields in the student table for the student in question.
What I need to check is....their is a field in the student table called SubPaid with two possible values of Yes and No. Before a student is added to class, I want to check if the SubPaid field for the student is set to Yes. If it is then allow the relationship and it is not then give error.
Now it would be easy to write a _validate function for this but I don't know where I would place it since relational tables don't seem to have a delegate class.
I have also looked at BeforeAddRelatedRecord function for delegate classes but I am not sure how to make it do what I need to do.
Any help on this matter would be greatly appreciated. Oh and I am using version 1.3rc6 2510 of xataface.
Thanks in advance.
Re: Before adding a relationship to a relational table
Posted:
Wed Nov 02, 2011 9:40 am
by shannah
Sounds like you want to use the beforeAddRelatedRecord() delegate class method.
- Code: Select all
function beforeAddRelatedRecord(/**Dataface_RelatedRecord*/ $record){
$parentRecord = $record->getParent();
// This is the parent record (i.e. the record from the base table. isa Dataface_Record)
if ( /* some condition fails */ ){
return PEAR::raiseError('Some error occurred', DATAFACE_E_NOTICE);
}
}
This method goes in the delegate class for the base table (not the target of the relationship).
-Steve
Re: Before adding a relationship to a relational table
Posted:
Sun Nov 06, 2011 3:44 am
by umair
Ok two problems, the relationship can be added through the sub-functions of both the student and class tabs, So when adding students from the class tab the beforeaddRelatedRecord doesn't get checked.
Second, even when the code is added to the delegate class of the student table, I cannot get the value for the field that I want to check against.
I would like to apologize in advance as I am still a complete beginner here.
Thanks
Re: Before adding a relationship to a relational table
Posted:
Mon Nov 07, 2011 10:01 am
by shannah
the relationship can be added through the sub-functions of both the student and class tabs,
Not sure I understand. If you have 2 different relationships then of course one relationship won't run another relationship's triggers. 2 relationships means 2 sets of triggers.
even when the code is added to the delegate class of the student table, I cannot get the value for the field that I want to check against
Why not?
Re: Before adding a relationship to a relational table
Posted:
Tue Nov 08, 2011 7:56 am
by umair
Well I can ignore the other relationship(might even remove it) since I am still trying to get the trigger to work with the first one.
In the student table delegate class I have put in the following:
function beforeAddRelatedRecord($record){
$parentRecord = $record->getParent(); //This correctly pulls the whole record for the student that I am trying to add the relationship, what I need is a specific field from the record
//So after looking around the forums I tried
//$parentRecord = $record->getParent('fieldname'); ------ fieldname is the exact name of the field in the student table in MySql database
//$parentRecord = $record->getParent("fieldname");
//$parentRecord = $record->getParent($fieldname) ; ----- and all the combination of the three plus tried making another variable as follows
//$res = $parentRecord->val("fieldname"); // with the same variations of the parameters for the ones above but cannot get the value of the field to be stored as the variable.
// This is the parent record (i.e. the record from the base table. isa Dataface_Record)
if ( $res = Unpaid ){ //so this doesn't work
return PEAR::raiseError('Some error occurred', DATAFACE_E_NOTICE);
}
Basically I don't know how to get the value of a specific field from the record. I have tried var_dump() with all my attempts and none of catch the field.
I know my noobness must be getting annoying, but again any help is appreciated.
Re: Before adding a relationship to a relational table
Posted:
Tue Nov 08, 2011 9:18 am
by ADobkin
I think your last attempt is basically correct:
umair wrote://$res = $parentRecord->val("fieldname");
However, you don't have the value in quotes here, so perhaps that is the problem:
umair wrote:if ( $res = Unpaid ){ //so this doesn't work
return PEAR::raiseError('Some error occurred', DATAFACE_E_NOTICE);
}
You could also try something like this for simple debugging before the if statement:
- Code: Select all
echo 'RESULT: ' . $res
;
Re: Before adding a relationship to a relational table
Posted:
Tue Nov 08, 2011 10:16 am
by shannah
- Code: Select all
if ( $res = Unpaid ){ //so this doesn't work
This will never work for two reasons:
1. If Unpaid is a constant then it will always return true because you are using assignment (=) and not equality comparison (==).
2. If Unpaid is not a constant then it will always be false because Unpaid doesn't exist.
Perhaps you're looking for something like:
- Code: Select all
if ( $res == 'Unpaid' ) {
-Steve
Re: Before adding a relationship to a relational table
Posted:
Tue Nov 08, 2011 11:20 am
by umair
Oh wow got that part to work thanks to you guys.
Ok now for the last part of my problem and I am keeping in mind that it may not be possible.
So I am wondering if there is a way to pull the record of the other table in the relationship. i.e.
I am adding student1 to class1, the record for student 1 is pulled using $record->getParent()
Is there anyway I can get the record for class1 while still having the code in the student table delegate class?
or
Get the record of the relationship that is being created i.e.
Class_Student (table)
StudentID - ClassID
1 1
2 1
3 1 (new record that is being created)
If I can get the record with studentID == 3 and classID == 1, I could get the rest of the field values using mysql_query
Thanks
Re: Before adding a relationship to a relational table
Posted:
Tue Nov 08, 2011 11:48 am
by shannah
What is the relationship definition in the relationships.ini file?
Steve
Re: Before adding a relationship to a relational table
Posted:
Tue Nov 08, 2011 2:28 pm
by umair
The relational table is called student_class
Student -- relationship.ini
Class.ClassID = student_class.ClassID
student_class.StudentID = "$StudentID"
Class -- relationship.ini
Student.StudentID = student_class.StudentID
student_class.ClassID = "$classID"
Re: Before adding a relationship to a relational table
Posted:
Thu Nov 10, 2011 9:47 pm
by umair
Ok I am going to take a guess and say that their is no way to pull record from the other table while adding relationships.
Thanks for the help.
Re: Before adding a relationship to a relational table
Posted:
Fri Nov 11, 2011 12:55 pm
by shannah
Of course there is a way.
df_get_record() function can load a single record from any table.
df_get_records_array() function can load multiple records at a time.
Re: Before adding a relationship to a relational table
Posted:
Fri Nov 11, 2011 10:33 pm
by umair
Ok sorry I should have clarified what I was saying.
lets say with something like this:
df_get_record('class' , array('ClassID'=>##));
I can get the record for the class with ## ID, but I have to specify a static ID in that line. It doesn't pull from the record directly related to the relationship.
so If I am adding Student with StudentID=>20 to Class with ClassID=>12, It won't dynamically pull the record of the class with ID of 12.
I could have something like:
function beforeAddRelatedRecord($record) {
$parentRecord = $record->getParent();
$res = $parentRecord->val('StudentID');
$res2 = df_get_record('student_class', array('StudentID'=>$res));
$res3 = $res2->val('ClassID');
}
The value $res3 will have all the ClassIDs that are related to the student in the parentRecord.
I hope this was a bit more clear.
Re: Before adding a relationship to a relational table
Posted:
Sun Nov 13, 2011 6:44 pm
by shannah
Still not clear on what your problem is. You can load anything you want from the database using any method you choose (df_get_record, df_get_records_array, mysql_query, or any other method...). So I don't understand why there would be any information you couldn't retrieve.
Your example posted has a few problems:
- Code: Select all
$res = $parentRecord->val('StudentID');
$res2 = df_get_record('student_class', array('StudentID'=>$res));
$res3 = $res2->val('ClassID');
$res would contain the scalar integer StudentID of the parent record.
$res2 would contain a Dataface_Record object encapsulating a row from the student_class table.
$res2 would contain the scalar integer ClassID from the $res2 record.
However if there are no records matching your query to load $res2 then $res2 could be null, which would cause the next line to have a fatal error because you'd be calling a method on a null value.
It is still unclear to me what you are trying to achieve here. If you are adding a student to a class (as you mentioned earlier), then the parentRecord would be the class, and the class wouldn't have a StudentID field. So I assume then that this snippet is from the beforeAddRelatedRecord() method in the Students table (i.e. you are adding a class to a student). But then again... still not clear what you want to do here.
Re: Before adding a relationship to a relational table
Posted:
Tue Nov 15, 2011 11:47 am
by umair
Going to try again, At this point I have trigger in the Student delegate class to check a field from the parentRecord before allowing relationship. Thanks to you guys it work perfectly.
But as can be seen from the relationships.ini for both tables, the relationship goes both ways, I can either add a class to student, or student to class. The trigger since it is in student delegate class is called properly when I add classes to student, but since there is no trigger in the class delegate class, no validation is performed.
So my problem is getting a trigger for the class table delegate class, but since the field that needs to be checked is a student table field, I don't know how to call the record for the student being added to class.