Laravel Keep Data в классе

Я хочу сделать что-то подобное.

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? Большое спасибо и извините за мой плохой английский.

Вы пробовали этот ответ?

Victor Anuebunwa 02.06.2018 16:43

Я очень благодарен за вашу помощь, я использую другой простой способ достичь своей цели. Я сохраняю модель в конструкторе вместо отношения, чтобы получить нужные мне данные.

Curtis 13.06.2018 14:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
2
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Объект 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();?

Примечание: коды не тестировались, надеюсь, вы уловили идею.

Другие вопросы по теме