Хранить данные в классе Laravel - PullRequest
0 голосов
/ 31 мая 2018

Я хочу сделать что-то вроде этого.

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);.

* 1007.* Я думаю, мне следует использовать newQuery?

Моя проблема в том, как получить данные из MySQL и сохранить их в SomeRepository и захватывать данные, когда я хочу (потому что мне нужно иметь возможность фильтровать любыеданные hasMany в любое время)или как спроектировать класс, который я хочу в Laravel?Большое спасибо и извините за мой плохой английский.

1 Ответ

0 голосов
/ 31 мая 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...