Я хочу сделать что-то подобное.
namespace App\Repositories;
use Illuminate\Database\Eloquent\Relations\HasMany;
class SomeRepository {
/**
* HasMany
*/
private $relation;
public function __construct(HasMany $hasMany) {
$this->relation = $hasMany;
}
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->relation->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->relation->where('status', '=', 1)->orderBy('order', 'ASC')->first();
}
}
Когда я использую get() для получения всей связи, он не может получить никаких данных с помощью $this->relation->where('status', '=', 1);.
Думаю, стоит ли использовать newQuery?
Моя проблема в том, как получить данные из MySQL и сохранить их в SomeRepository и получить данные, когда я захочу (потому что мне нужно иметь возможность фильтровать любые данные из hasMany в любое время).
В моем дизайне неправильная логика? или как создать класс, который я хочу в Laravel? Большое спасибо и извините за мой плохой английский.
Я очень благодарен за вашу помощь, я использую другой простой способ достичь своей цели. Я сохраняю модель в конструкторе вместо отношения, чтобы получить нужные мне данные.






Объект 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();?
Примечание: коды не тестировались, надеюсь, вы уловили идею.
Вы пробовали этот ответ?