#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. ДА, НОЛЬ.
Вам нужно будет убедиться, что:
- Что ваш файл сущности использует инструкцию use, например.
use AppInvoiceEntityFamily
это указывает на Сущность, например. Семья
- Что у вас есть ссылка перед аннотацией, если вы используете фреймворк, например.
* @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=»нулевой».