Skip to content

Instantly share code, notes, and snippets.

@edfialk
Last active February 8, 2017 02:44
Show Gist options
  • Save edfialk/a87cb52ee8972b2e52dde1aeb69eb1dc to your computer and use it in GitHub Desktop.
Save edfialk/a87cb52ee8972b2e52dde1aeb69eb1dc to your computer and use it in GitHub Desktop.
<?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