Last active
February 8, 2017 02:44
-
-
Save edfialk/a87cb52ee8972b2e52dde1aeb69eb1dc to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Laravel model for post Category. | |
* Client wanted to set display rank for posts in a category list | |
* Categories have a set minimum display number | |
* $post->number is display rank + $category->post_number_start | |
* i.e. category has number_start = 100, 1st post to display would have $post->number = 101 | |
* These are functions for changing order | |
*/ | |
public function movePostToTop($post) | |
{ | |
//1,2,3,4,5 -> move 3 -> 3,1,2,4,5 - 1->2, 2->3 | |
$this->posts()->where('number', '<', $post->number)->each(function($p){ | |
$p->number = $p->number + 1; | |
$p->save(); | |
}); | |
$post->number = $this->post_number_start; | |
$post->save(); | |
} | |
public function movePostToBottom($post) | |
{ | |
//1,2,3,4,5 -> move 3 -> 1,2,4,5,3 - 4->3, 5->4 | |
$n = $this->posts()->max('number'); | |
$posts = $this->posts()->where('number', '>', $post->number)->get(); | |
foreach($posts as $p){ | |
// $n = $p->number; | |
$p->number = $p->number - 1; | |
$p->save(); | |
}; | |
$post->number = $n; | |
$post->save(); | |
} | |
public function movePostToNumber($post, $number) | |
{ | |
if ($number <= $this->post_number_start){ | |
return $this->movePostToTop($post); | |
} | |
if ($number >= ($this->posts()->max('number'))){ | |
return $this->movePostToBottom($post); | |
} | |
if ($post->number > $number){ | |
//moving post up | |
//1,2,3,4,5 -> move 4 to 2 -> 1,4,2,3,5 - 2->3, 3->4 | |
$this->posts()->where('number', '>=', $number)->where('number', '<', $post->number)->each(function($p){ | |
$p->number = $p->number + 1; | |
$p->save(); | |
}); | |
}else if ($post->number < $number){ | |
//moving post down | |
//1,2,3,4,5 -> move 2 to 4 -> 1,3,4,2,5 - 3->2, 4->3 | |
$this->posts()->where('number', '<=', $number)->where('number', '>', $post->number)->each(function($p){ | |
$p->number = $p->number - 1; | |
$p->save(); | |
}); | |
} | |
$post->number = $number; | |
$post->save(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment