Правильное получение связанной модели в цикле ORM

#php #orm #repository #cycle

Вопрос:

Возникла проблема: в проекте используется цикл ORM, есть 2 сущности. Я пытаюсь связать их с помощью аннотации, например:

 /**
* @CycleRelationBelongsTo(target = "CompanyCoreEntityCourtInfoCourtInfo")
*/
protected $court;
 

Но при доступе к $репозиторию->findOne()->>getCourt() Я получаю:

 object(CycleORMPromiseReference)#2212 (2) {
["role":"CycleORMPromiseReference":private]=>
string(42) "CompanyCoreEntityCourtInfoCourtInfo"
["scope":"CycleORMPromiseReference":private]=>
array(1) {
["id"]=>
int(15705)
 }
}
 

Но я хочу получить Сущность. Как я могу сделать это правильно? Опция работает, если вы добавляете аннотации fetch = «нетерпеливый» к параметрам, но тогда они будут загружены с нетерпением. Как я могу лениво загружать связанные объекты?

Ответ №1:

protected $court является ли ваше отношение или связь тем, как вы хотели бы ее называть.

Вот аналогичный фрагмент кода развилки демо-версии Yii3, который использует цикл из рабочего примера, который вы можете скачать здесь:

  /**
 * @BelongsTo(target="Family", nullable=false)
 *
 * @var CycleORMPromiseReference|Family
 */
private $family = null;
 

Файл, которому он принадлежит, является Product.php. Этот файл представляет продукт сущности.
Этот файл также содержит следующий код.

 /**
* @Column(type="integer(11)", nullable=true, default=null)
*/
private ?int $family_id = null;
 

Что такое семья? Семейство-это группа, к которой относится продукт, например. Туфли.

Как цикл использует эти аннотации и в чем разница между ними? Если вы синхронизировали свою базу данных здесь

…затем, если вы удалите всю таблицу продуктов, скажем, в MySQL, Cycle восстановит таблицу продуктов и внешний ключ ее таблицы, т. Е.. family_id для таблицы продуктов, ссылаясь на первичный ключ семейной сущности, т. е. $id, который указан в Family.php файл сущности и добавьте его в свое отношение $family, чтобы создать идентификатор внешнего ключа family_id в таблице продуктов. т. е. $family $id => идентификатор семьи. Все необходимые индексы и ограничения внешнего ключа будут созданы в MySQL автоматически.

Поэтому вы должны быть осторожны с тем, как вы называете свой первичный ключ в Family.php файл сущности или вы можете получить внешний ключ в таблице продуктов, например family_family_id, если вы назвали свой первичный ключ в Family.php сущность как $family_id.

Итак, если внешний ключ family_id таблиц продуктов автоматически создается отношением entities $family, почему второй фрагмент кода в вашей сущности продукта. т. е. $family_id = null ? Это делается для того, чтобы цикл мог использовать, например. nullable = true , по умолчанию = null для автоматического создания свойств MySQL для столбца ie. ДА, НОЛЬ.

Вам нужно будет убедиться, что:

  1. Что ваш файл сущности использует инструкцию use, например.
 use AppInvoiceEntityFamily  
 

это указывает на Сущность, например. Семья

  1. Что у вас есть ссылка перед аннотацией, если вы используете фреймворк, например.
     * @var CycleORMPromiseReference|Family
     

Как семейство $используется в репозитории? например. СущностьПродуктProductRepository

 public function repoProductquery(string $product_id): Product
    {
        $query = $this
            ->select()
            ->load('family')
            ->load('tax_rate')
            ->load('unit')
            ->where(['id' => $product_id]);
        return  $query->fetchOne();        
    }
 

В приведенном выше коде загружается отношение «семья», которое позволит представлению продукта использовать код

 <?= $product->getFamily()->family_name;?>
 

чтобы получить имя семьи из семейной сущности.

Баллы: $product передается из ProductController здесь:

…использование

 //load EntityProduct BelongTo relations ie. $family, $tax_rate, $unit by means of repoProductQuery             
            'product'=>$productRepository->repoProductquery($this->product($request, $productRepository)->getProduct_id()),
 

и getFamily () — это функция в сущности продукта, аналогичная вашей getCourt (), с важной частью кода в строке 134, которая извлекает связь …

 //relation $family
   public function getFamily(): ?Family
   {
        return $this->family;
   }
 

Обратите внимание, что приведенная выше функция getFamily() имеет ?Тип семейства, указывающий сущность Продукта на Семейную сущность.

Как я могу лениво загружать связанные объекты?

 /**
     * @BelongsTo(target="AppUserUser", nullable=false, load="eager")
     *
     * @var CycleORMPromiseReference|User
     */
    private $user = null;
 

Ответ: Удалите load=»нетерпеливый» или load=»нулевой».