Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

General Questions

General questions about getting started with SilverStripe that don't fit in any of the categories above.

Moderators: martimiz, Sean, biapar, Willr, Ingo, swaiba, simon_w

Comparing Columns in DataObjects


3 Posts   386 Views


11 July 2012 at 11:11am Community Member, 48 Posts

I've been wrestling with this problem for a while now and can't see how to go about it. I have 2 dataobjects (Project, Enhancement). Project has many Enhancements, Enhancement has one Project.

I was using the ProjectsID column in Enhancements to get Enhancements that haven't been assigned to a project. I also only want to get enhancements that are at certain status levels (I don't want completed enhancements to show in the list)

$enhancements = new DataObjectSet();
$enhancements->merge(DataObject::get('Enhancement', "StatusLevelsID = 1 AND ProjectsID = 0")); // Approved
$enhancements->merge(DataObject::get('Enhancement', "StatusLevelsID = 4 AND ProjectsID = 0")); // In Progress

if ($enhancements) {
      $map = $enhancements->toDropdownMap('ID', 'Title');
   $fields->addFieldToTab("Root.ProjectEnhancements", new AsmselectField('Enhances', 'Enhancement', $map));

This was working great until I realized that if I delete a project, there will be enhancements with a ProjectsID equal to a deleted Project ID and I won't be able to add them to another project.

So instead of just getting ProjectsID = 0, I need to get ProjectsID that don't match an existing ID for my Project class. I'm not sure how to find these.



11 July 2012 at 8:45pm (Last edited: 11 July 2012 8:45pm), Community Member, 46 Posts

Just to check: Enhancement actually "has one or zero" Projects?

If that is the case, you can either remove the Link from the Enhancements before a Project is deleted, or execute an SQL query that will set them to zero. Use onBeforeDelete for that:

class Project extends ... {
//Alternative 1
//loop over $this->Enhancements and unset the link. Should work similar to this
foreach($this->Enhancements() as $enhancement){
$enhancement->Project = null;
//Alternative 2
//Execute SQL: UPDATE Enhancements SET ProjectID = 0 WHERE ProjectID = $this->ID;
//in both cases make sure to call the original method, there might be important stuff in it.


12 July 2012 at 2:26am Community Member, 48 Posts

Thanks for the help jak. I was able to get it to work using alternative 2 like:

function OnBeforeDelete() {

   DB::query("UPDATE Enhancement SET ProjectsID=0 WHERE ProjectsID={$this->ID}");