Загрузка объектов модели в Laravel при передаче primarykey в new () - PullRequest
0 голосов
/ 29 апреля 2019

Я начинаю играть с моделями Eloquent.У меня есть следующая модель:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

/**
 * Class Character
 * @package App
 *
 * @property string $name
 * @property int $id
 * @property int $score
 */
class Character extends Model
{
    protected $table = 'characters';

    public function __construct(array $attributes = [])
    {
        parent::__construct($attributes);
    }
}

Мой вопрос: возможно ли это, когда я делаю следующее:

$ симулятор = новый персонаж (1);// 1 - это первичный ключ

Я бы хотел, чтобы он пошел вперед и загрузил модель с информацией в базе данных.Если его не существует, я бы хотел установить 1 как $character->id.Это возможно?Или Eloquent уже делает это, а я что-то упускаю?

Ответы [ 3 ]

0 голосов
/ 29 апреля 2019

Не делай этого.Eloquent не предназначен для такой работы.Переопределение конструктора таким образом неизбежно вызовет множество проблем в будущем.

Подумайте о добавлении статического метода для вашего варианта использования - во многом как решение Имрана выше.Таким образом, вы можете наслаждаться странным поведением, которое вам нужно, не рискуя нарушить что-либо еще.

0 голосов
/ 29 апреля 2019

Ближайшее решение, которое вы можете получить, это использовать функцию findOrNew () https://laravel.com/api/5.2/Illuminate/Database/Eloquent/Builder.html#method_findOrNew.

Вы можете использовать его как

$character = Character::findOrNew(1);

Это запросит таблицу символов для идентификатора 1 и вернетэкземпляр модели Character, если идентификатор не найден в базе данных, будет создан и возвращен новый экземпляр модели Character.Однако нет опции для установки идентификатора модели.

0 голосов
/ 29 апреля 2019

Теоретически вы можете сделать это следующим образом:

public function __construct($primaryKey)
{
  parent::__construct($attributes);
  $character = self::find($primaryKey);

  if(is_null($character)){
    $character = self::find(1);
  }
  return $character;
}

Но, в идеале, вы не должны этого делать, потому что Laravel не разработан таким образом.Вам лучше сделать то же самое за пределами модели.Кроме того, в этом коде есть еще одна проблема, мы жестко кодируем $primaryKey = 1, если объект не найден.Такое жестко закодированное значение иногда может быть рискованным.

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