Объект HasMany
не может быть использован для достижения того, чего вы хотите, потому что объект нельзя использовать повторно так, как вы хотите.Выполнение базового запроса с использованием get()
или first()
в объекте не сбрасывает его в его предыдущее состояние, как было передано в конструкторе, как вы ожидаете.
Пример
function getBooks($model){
$result = $model->get();
}
$model = new Book;
$books = getBooks($model); //Gets books
$model = $model->where('published', true);
$books = getBooks($model); //Gets only published books. Notice the where('published', true); condition called above on the model is still active?
Вы больше не получаете результаты при повторном использовании relation
, потому что старые запросы и выполняемые на нем условия все еще активны.Чтобы сохранить состояние объекта, переданного в конструктор, вам, возможно, придется каждый раз копировать его.
namespace App\Repositories;
use Illuminate\Database\Eloquent\Relations\HasMany;
class SomeRepository {
/**
* HasMany
*/
private $relation;
public function __construct(HasMany $hasMany) {
$this->relation = $hasMany;
}
private function copyRelation(){
$clone = clone $this->relation;
return $clone;
}
public function setStatus($obj_id, $status) {
$status_on = $this->getStatusOn();
switch($status) {
case 0:
$status_on->status = 0;
$status_on->save();
break;
case 1:
$status_to_on = $this->copyRelation()->where('id', '=', $obj_id)->first();
if ($status_on) {
$status_on->status = 0;
$status_on->save();
}
$status_to_on->status = 1;
$status_to_on->save();
break;
}
}
public function getStatusOn() {
return $this->copyRelation()->where('status', '=', 1)->orderBy('order', 'ASC')->first();
}
Обратите внимание, как я использовал SomeRepository::copyRelation();
?
Примечание: коды не были проверены, я надеюсь, что вы поняли.