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


Reply


3 Posts   419 Views

Avatar
woodb2

Community Member, 48 Posts

11 July 2012 at 11:11am

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.

Brian

Avatar
jak

Community Member, 46 Posts

11 July 2012 at 8:45pm

Edited: 11/07/2012 8:45pm

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 ... {
onBeforeDelete(){
//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.
parent::onBeforeDelete();
}
}

Avatar
woodb2

Community Member, 48 Posts

12 July 2012 at 2:26am

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}");

   parent::onBeforeDelete();
}