tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

Jak přiřadit entitu k entitě s vazbou 1:1?

před 5 lety

medhi
Bronze Partner | 189

Ahoj,

nikde jsem nenašel, jak se přiřazuje entita k entitě se vzájemnou vazbou 1:1. Všechny mé pokusy selhaly. Díky

před 5 lety

Tharos
Člen | 1042
/**
 * @property BookDetail $detail m:hasOne
 */
class Book ...
/**
 * @property Book $book m:belongsToOne
 */
class BookDetail ...
$book->detail = $bookDetail;

Takhle to nejde? :)

před 5 lety

medhi
Bronze Partner | 189

Jde, ale trvalo mi hodně dlouho, než mi to došlo. Nejdřív jsem si myslel, že pokud mám vazbu 1:1, mají být obě vazby popsány m:belongsToOne.

Možná jsou tyhle věci nějak samozřejmé, ale toto je můj první ORM a nedošlo mi to. Nešlo by do dokumentace připsat, co jednotlivé definice vlastně přesně vyjadřují? Předpokládám, že i vazeb 1:1 může být více typů (obě tabulky mají cizi_id nebo jenom jedna).

před 5 lety

castamir
Člen | 631

Vazby jsou 4 viz dokumentace. Kterou použít, tak na to Tharos doporučuje doslova říct si ty entity a vazby:

  • Book has one Author (FK je v Book)
  • Product belongs to Product detail (FK je v Product detail)
  • Book has many Tags (vazební tabulka book_tag)
  • Author belongs to many Books (FK je v Book)

Editoval castamir (1. 8. 2014 8:48)

před 5 lety

Tharos
Člen | 1042

Castamir to popsal úplně přesně. Pokud bys chtěl ještě nějaké ukázky, tak vazby v tomto modelu by vypadaly zhruba následovně:

/**
 * @property Book[] $books m:belongsToMany
 */
class Author extends Entity
{
}

/**
 * @property Author $author m:hasOne
 * @property Borrowing[] $borrowings m:belongsToMany
 */
class Book extends Entity
{
}

/**
 * @property Book[] $books m:hasMany
 */
class Tag extends Entity
{
}

/**
 * @property Book $book m:hasOne
 * @property Borrower $borrower m:hasOne
 */
class Borrowing extends Entity
{
}

/**
 * @property Borrowing $borrowing m:belongsToMany
 */
class Borrower extends Entity
{
}

No a pokud bychom si zavedli umělé omezení, že zákazník knihovny (Borrower) může mít v konkrétní okamžik půjčenou pouze jednu výpůjčku, stačilo přidat unikátní index nad sloupec borrowing.borrower_id a pak by entita Borrower mohla vypadat následovně:

/**
 * @property Borrowing $borrowing m:belongsToOne
 */
class Borrower extends Entity
{
}

Entita Borrowing by zůstala nezměněná.

Tohle v podstatě zahrnuje všechny varianty. :)

Editoval Tharos (1. 8. 2014 23:06)