Moves relations to the top of the model and delete/save/restore/trash methods close to each other for easy navigation

This commit is contained in:
Vlad
2017-04-27 22:31:01 -04:00
parent 589c54e205
commit 6441c781a5

View File

@@ -29,7 +29,41 @@ class Newsletter extends Model {
}
function queue() {
return $this->has_one(__NAMESPACE__ . '\SendingQueue', 'newsletter_id', 'id');
return $this->hasOne(__NAMESPACE__ . '\SendingQueue', 'newsletter_id', 'id');
}
function children() {
return $this->hasMany(
__NAMESPACE__.'\Newsletter',
'parent_id',
'id'
);
}
function segments() {
return $this->hasManyThrough(
__NAMESPACE__.'\Segment',
__NAMESPACE__.'\NewsletterSegment',
'newsletter_id',
'segment_id'
);
}
function segmentRelations() {
return $this->hasMany(
__NAMESPACE__.'\NewsletterSegment',
'newsletter_id',
'id'
);
}
function options() {
return $this->hasManyThrough(
__NAMESPACE__.'\NewsletterOptionField',
__NAMESPACE__.'\NewsletterOption',
'newsletter_id',
'option_field_id'
)->select_expr(MP_NEWSLETTER_OPTION_TABLE.'.value');
}
function save() {
@@ -51,6 +85,91 @@ class Newsletter extends Model {
return parent::save();
}
function trash() {
// trash queue association
if($queue = $this->queue()->findOne()) {
$queue->trash();
}
return parent::trash();
}
static function bulkTrash($orm) {
// bulk trash queue associations
parent::bulkAction($orm, function($ids) {
SendingQueue::rawExecute(join(' ', array(
'UPDATE `' . SendingQueue::$_table . '`',
'SET `deleted_at` = NOW()',
'WHERE `newsletter_id` IN (' . rtrim(str_repeat('?,', count($ids)), ',') . ')'
)),
$ids
);
});
return parent::bulkTrash($orm);
}
function delete() {
// delete segment associations
$this->segmentRelations()->deleteMany();
// delete queue association
if($queue = $this->queue()->findOne()) {
$queue->delete();
}
return parent::delete();
}
static function bulkDelete($orm) {
// bulk delete segment associations
parent::bulkAction($orm, function($ids) {
NewsletterSegment::whereIn('newsletter_id', $ids)
->deleteMany();
});
// bulk delete queue associations
parent::bulkAction($orm, function($ids) {
SendingQueue::whereIn('newsletter_id', $ids)
->deleteMany();
});
return parent::bulkDelete($orm);
}
function restore() {
// restore trashed queue association
if($queue = $this->queue()->findOne()) {
$queue->restore();
}
if($this->status == self::STATUS_SENDING) {
$this->set('status', self::STATUS_DRAFT);
$this->save();
}
return parent::restore();
}
static function bulkRestore($orm) {
// bulk restore trashed queue associations
parent::bulkAction($orm, function($ids) {
SendingQueue::whereIn('newsletter_id', $ids)
->whereNotNull('deleted_at')
->findResultSet()
->set('deleted_at', null)
->save();
});
parent::bulkAction($orm, function($ids) {
Newsletter::whereIn('id', $ids)
->where('status', Newsletter::STATUS_SENDING)
->findResultSet()
->set('status', Newsletter::STATUS_DRAFT)
->save();
});
return parent::bulkRestore($orm);
}
function setStatus($status = null) {
if(in_array($status, array(
self::STATUS_DRAFT,
@@ -175,43 +294,6 @@ class Newsletter extends Model {
return $model;
}
function trash() {
// trash queue association
if($queue = $this->queue()->findOne()) {
$queue->trash();
}
return parent::trash();
}
function delete() {
// delete segment associations
$this->segmentLinks()->deleteMany();
// delete queue association
if($queue = $this->queue()->findOne()) {
$queue->delete();
}
return parent::delete();
}
function children() {
return $this->has_many(
__NAMESPACE__.'\Newsletter',
'parent_id',
'id'
);
}
function segments() {
return $this->has_many_through(
__NAMESPACE__.'\Segment',
__NAMESPACE__.'\NewsletterSegment',
'newsletter_id',
'segment_id'
);
}
function withSegments($incl_deleted = false) {
$this->segments = $this->segments()->findArray();
if($incl_deleted) {
@@ -220,19 +302,10 @@ class Newsletter extends Model {
return $this;
}
// Intermediary table only
function segmentLinks() {
return $this->has_many(
__NAMESPACE__.'\NewsletterSegment',
'newsletter_id',
'id'
);
}
function withDeletedSegments() {
if(!empty($this->segments)) {
$segment_ids = Helpers::arrayColumn($this->segments, 'id');
$links = $this->segmentLinks()
$links = $this->segmentRelations()
->whereNotIn('segment_id', $segment_ids)->findArray();
$deleted_segments = array();
@@ -253,15 +326,6 @@ class Newsletter extends Model {
return $this;
}
function options() {
return $this->has_many_through(
__NAMESPACE__.'\NewsletterOptionField',
__NAMESPACE__.'\NewsletterOption',
'newsletter_id',
'option_field_id'
)->select_expr(MP_NEWSLETTER_OPTION_TABLE.'.value');
}
function getQueue($columns = '*') {
return SendingQueue::select($columns)
->where('newsletter_id', $this->id)
@@ -729,69 +793,4 @@ class Newsletter extends Model {
self::NEWSLETTER_HASH_LENGTH
);
}
function restore() {
// restore trashed queue association
if($queue = $this->queue()->findOne()) {
$queue->restore();
}
if($this->status == self::STATUS_SENDING) {
$this->set('status', self::STATUS_DRAFT);
$this->save();
}
return parent::restore();
}
static function bulkTrash($orm) {
// bulk trash queue associations
parent::bulkAction($orm, function($ids) {
SendingQueue::rawExecute(join(' ', array(
'UPDATE `' . SendingQueue::$_table . '`',
'SET `deleted_at` = NOW()',
'WHERE `newsletter_id` IN (' . rtrim(str_repeat('?,', count($ids)), ',') . ')'
)),
$ids
);
});
return parent::bulkTrash($orm);
}
static function bulkRestore($orm) {
// bulk restore trashed queue associations
parent::bulkAction($orm, function($ids) {
SendingQueue::whereIn('newsletter_id', $ids)
->whereNotNull('deleted_at')
->findResultSet()
->set('deleted_at', null)
->save();
});
parent::bulkAction($orm, function($ids) {
Newsletter::whereIn('id', $ids)
->where('status', Newsletter::STATUS_SENDING)
->findResultSet()
->set('status', Newsletter::STATUS_DRAFT)
->save();
});
return parent::bulkRestore($orm);
}
static function bulkDelete($orm) {
// bulk delete segment associations
parent::bulkAction($orm, function($ids) {
NewsletterSegment::whereIn('newsletter_id', $ids)
->deleteMany();
});
// bulk delete queue associations
parent::bulkAction($orm, function($ids) {
SendingQueue::whereIn('newsletter_id', $ids)
->deleteMany();
});
return parent::bulkDelete($orm);
}
}