Piotrek Kaźmierczak

Piotrek Kaźmierczak sky is the limit...

Temat: [Doctrine & MySQL] Relacja many-to-many psuje zapytanie SQL.

Witam,

Stworzyłem poniższy schemat YAML (oprócz tego standardowy schemat sfGuard).


Artykul:
columns:
autor_id:
type: integer(4)
notnull: true
unsigned: true
edytor_id:
type: integer(4)
unsigned: true
tytul:
type: string(255)
notnull: true
opis:
type: clob
notnull: true
status:
type: enum
notnull: true
values: ['NADESŁANY', 'RECENZOWANY', 'ODRZUCONY', 'ZAAKCEPTOWANY', 'POPRAWIANY', 'PRZYDZIELONY']
default: NADESŁANY
indexes:
tytul:
fields: [tytul]
relations:
Autor:
class: sfGuardUser
foreignAlias: Artykuly
Edytor:
class: sfGuardUser
foreignAlias: ArtykulyPrzydzielone
Wspolautorzy:
class: sfGuardUser
refClass: Wspolautorzy
foreignAlias: Wspolautorzy
Publikacja:
local: id
foreign: artykul_id

Wspolautorzy:
columns:
artykul_id:
type: integer(4)
notnull: true
unsigned: true
primary: true
user_id:
type: integer(4)
notnull: true
unsigned: true
primary: true
relations:
Wspolautor:
class: sfGuardUser
onDelete: CASCADE
foreignAlias: Wspolautorzy
Artykul:
onDelete: CASCADE
foreignAlias: Wspolautorzy

Rewizja:
actAs:
Timestampable:
updated:
disabled: true
columns:
nr:
type: integer(1)
notnull: true
unsigned: true
default: 1
artykul_id:
type: integer(4)
notnull: true
unsigned: true
relations:
Artykul:
foreignAlias: Rewizje
Recenzenci:
class: sfGuardUser
refClass: RecenzenciRewizji
foreignAlias: RecenzowaneRewizje

RecenzenciRewizji:
columns:
rewizja_id:
type: integer(4)
notnull: true
unsigned: true
primary: true
user_id:
type: integer(4)
notnull: true
unsigned: true
primary: true
relations:
Rewizja:
onDelete: CASCADE
foreignAlias: RecenzenciRewizji
Recenzent:
class: sfGuardUser
onDelete: CASCADE
foreignAlias: RecenzenciRewizji

Publikacja:
columns:
artykul_id:
type: integer(4)
notnull: true
unsigned: true
ocena:
type: float
notnull: true
unsigned: true
default: 1
checks:
ocena_min: ocena >= 1
ocena_max: ocena <= 10
relations:
Artykul:
foreignType: one

Recenzja:
columns:
recenzent_id:
type: integer(4)
unsigned: true
notnull: true
rewizja_id:
type: integer(4)
unsigned: true
notnull: true
tresc:
type: clob
notnull: true
tresc_dla_edytora:
type: clob
ocena:
type: integer(1)
unsigned: true
notnull: true
default: 1
jakosc:
type: integer(1)
unsigned: true
notnull: true
default: 1
jezyk:
type: enum
notnull: true
values: ['prosty', 'w miarę prosty', 'trudny', 'bardzo trudny', 'nic nie da się zrozumieć']
default: prosty
stopien_trudnosci:
type: enum
notnull: true
values: ['początkujący', 'średnio zaawansowany', 'zaawansowany', 'ekspert']
default: początkujący
status:
type: enum
notnull: true
values: ['NIEROZPOCZĘTA', 'ROZPOCZĘTA', 'WYSŁANA', 'ODRZUCONA']
default: NIEROZPOCZĘTA
checks:
jakosc_min: jakosc >= 1
jakosc_max: jakosc <= 10
ocena_min: ocena >= 1
ocena_max: ocena <= 10
relations:
Recenzent:
class: sfGuardUser
foreignAlias: Recenzje
Rewizja:
foreignAlias: Recenzje

Plik:
options:
symfony:
form: false
filter: false
columns:
rewizja_id:
type: int(4)
notnull: true
unsigned: true
plik:
type: blob
notnull: true

WiarygodnoscCzytelnika:
options:
symfony:
form: false
filter: false
columns:
user_id:
type: integer(4)
notnull: true
unsigned: true
wiarygodnosc:
type: float
notnull: true
unsigned: true
default: 0

ZainteresowaniaCzytelnika:
options:
symfony:
form: false
filter: false
columns:
user_id:
type: integer(4)
notnull: true
unsigned: true
primary: true
zainteresowanie_id:
type: integer(4)
notnull: true
unsigned: true
primary: true
relations:
Czytelnik:
class: sfGuardUser
onDelete: CASCADE
foreignAlias: ZainteresowaniaCzytelnika
Zainteresowanie:
class: Dziedzina
onDelete: CASCADE
foreignAlias: ZainteresowaniaCzytelnika

Dziedzina:
options:
symfony:
filter: false
columns:
nazwa:
type: string(255)
notnull: true
unique: true
relations:
Zainteresowania:
class: sfGuardUser
refClass: ZainteresowaniaCzytelnika
foreignAlias: Zainteresowania
Specjalnosci:
class: sfGuardUser
refClass: SpecjalnosciAutora
foreignAlias: Specjalnosci
Tematyka:
class: Artykul
refClass: TematykaArtykulu
foreignAlias: Tematyka

SpecjalnosciAutora:
options:
symfony:
form: false
filter: false
columns:
user_id:
type: integer(4)
notnull: true
unsigned: true
primary: true
specjalnosc_id:
type: integer(4)
notnull: true
unsigned: true
primary: true
relations:
Autor:
class: sfGuardUser
onDelete: CASCADE
foreignAlias: SpecjalnosciAutora
Specjalnosc:
class: Dziedzina
onDelete: CASCADE
foreignAlias: SpecjalnosciAutora


RangaAutora:
options:
symfony:
form: false
filter: false
columns:
user_id:
type: integer(4)
notnull: true
unsigned: true
ranga:
type: float
notnull: true
unsigned: true
default: 0

TematykaArtykulu:
options:
symfony:
form: false
filter: false
columns:
artykul_id:
type: integer(4)
notnull: true
unsigned: true
primary: true
tematyka_id:
type: integer(4)
notnull: true
unsigned: true
primary: true
relations:
Artykul:
onDelete: CASCADE
foreignAlias: TematykaArtykulu
Tematyka:
class: Dziedzina
onDelete: CASCADE
foreignAlias: TematykaArtykulu


Przy doctrine:build --all, wyrzuca mi błąd podczas wrzucania kodu sql:

SQLSTATE[42000]: Syntax error or access violation: 1072 Key column 'sf_guard_user_id' doesn't exist in table. Failing Query: "CREATE TABLE artykul (id BIGINT AUTO_INCREMENT, autor_id INT UNSIGNED NOT NULL, edytor_id INT UNSIGNED, tytul VARCHAR(255) NOT NULL, opis LONGTEXT NOT NULL, status VARCHAR(255) DEFAULT 'NADES�ANY' NOT NULL, INDEX tytul_idx (tytul), INDEX sf_guard_user_id_idx (sf_guard_user_id), PRIMARY KEY(id)) ENGINE = INNODB". Failing Query: CREATE TABLE artykul (id BIGINT AUTO_INCREMENT, autor_id INT UNSIGNED NOT NULL, edytor_id INT UNSIGNED, tytul VARCHAR(255) NOT NULL, opis LONGTEXT NOT NULL, status VARCHAR(255) DEFAULT 'NADES�ANY' NOT NULL, INDEX tytul_idx (tytul), INDEX sf_guard_user_id_idx (sf_guard_user_id), PRIMARY KEY(id)) ENGINE = INNODB  


Nie wiem zbytnio jak sobie poradzić. Symfony już nieco poznałem i zdążyłem się zorientować, że nauczenie symfony to nie problem... trzeba dobrze poznać Doctrine.
Nie wszystko jest jeszcze dla mnie jasne, nie wiem czy dobrze implementuje relacje w YAMLu. Jadę głównie z manuala, przeglądałem jakieś inne fora każdy chyba inaczej robi te relacje ^^. Czy wszystko to co wpisuje jest konieczne, lub czy czegoś nie pomijam?

Gdzie tkwi mój błąd?

Pozdrawiam,
PKPiotrek Kaźmierczak edytował(a) ten post dnia 07.01.11 o godzinie 00:28
Piotrek Kaźmierczak

Piotrek Kaźmierczak sky is the limit...

Temat: [Doctrine & MySQL] Relacja many-to-many psuje zapytanie SQL.

Ok uporałem się z tym. Zamieszczam kod dla potomnych.

Przede wszystkim były źle podpisane klucze obce przez to doctrine (a później sql) odwoływał się do błędnych indeksów.

Później narodził się problem przy tworzeniu kluczy obcych - niezgodność typów.

Dlatego wszędzie przy kluczach obcych zamieniłem integer(4) na integer, a atrybut unsigned: true usunałem.

Pzdr!


Artykul:
columns:
autor_id:
type: integer
notnull: true
edytor_id:
type: integer
tytul:
type: string(255)
notnull: true
opis:
type: clob
notnull: true
status:
type: enum
notnull: true
values: ['NADESŁANY', 'RECENZOWANY', 'ODRZUCONY', 'ZAAKCEPTOWANY', 'POPRAWIANY', 'PRZYDZIELONY']
default: NADESŁANY
indexes:
tytul:
fields: [tytul]
relations:
Autor:
local: autor_id
class: sfGuardUser
foreignAlias: Artykuly
Edytor:
local: edytor_id
class: sfGuardUser
foreignAlias: ArtykulyPrzydzielone
Wspolautorzy:
class: sfGuardUser
refClass: Wspolautorzy
foreignAlias: Wspolautorzy
Publikacja:
local: id
foreign: artykul_id

Wspolautorzy:
columns:
artykul_id:
type: integer
notnull: true
primary: true
wspolautor_id:
type: integer
notnull: true
primary: true
relations:
Wspolautor:
class: sfGuardUser
local: wspolautor_id
onDelete: CASCADE
foreignAlias: Wspolautorzy
Artykul:
onDelete: CASCADE
foreignAlias: Wspolautorzy

Rewizja:
actAs:
Timestampable:
updated:
disabled: true
columns:
nr:
type: integer(1)
notnull: true
unsigned: true
default: 1
artykul_id:
type: integer
notnull: true
relations:
Artykul:
foreignAlias: Rewizje
Recenzenci:
class: sfGuardUser
refClass: RecenzenciRewizji
foreignAlias: RecenzowaneRewizje

RecenzenciRewizji:
columns:
rewizja_id:
type: integer
notnull: true
primary: true
recenzent_id:
type: integer
notnull: true
primary: true
relations:
Rewizja:
onDelete: CASCADE
foreignAlias: RecenzenciRewizji
Recenzent:
class: sfGuardUser
local: recenzent_id
onDelete: CASCADE
foreignAlias: RecenzenciRewizji

Publikacja:
columns:
artykul_id:
type: integer
notnull: true
ocena:
type: float
notnull: true
unsigned: true
default: 1
checks:
ocena_min: ocena >= 1
ocena_max: ocena <= 10
relations:
Artykul:
foreignType: one

Recenzja:
columns:
recenzent_id:
type: integer
notnull: true
rewizja_id:
type: integer
notnull: true
tresc:
type: clob
notnull: true
tresc_dla_edytora:
type: clob
ocena:
type: integer(1)
unsigned: true
notnull: true
default: 1
jakosc:
type: integer(1)
unsigned: true
notnull: true
default: 1
jezyk:
type: enum
notnull: true
values: ['prosty', 'w miarę prosty', 'trudny', 'bardzo trudny', 'nic nie da się zrozumieć']
default: prosty
stopien_trudnosci:
type: enum
notnull: true
values: ['początkujący', 'średnio zaawansowany', 'zaawansowany', 'ekspert']
default: początkujący
status:
type: enum
notnull: true
values: ['NIEROZPOCZĘTA', 'ROZPOCZĘTA', 'WYSŁANA', 'ODRZUCONA']
default: NIEROZPOCZĘTA
checks:
jakosc_min: jakosc >= 1
jakosc_max: jakosc <= 10
ocena_min: ocena >= 1
ocena_max: ocena <= 10
relations:
Recenzent:
local: recenzent_id
class: sfGuardUser
foreignAlias: Recenzje
Rewizja:
foreignAlias: Recenzje

Plik:
options:
symfony:
form: false
filter: false
columns:
rewizja_id:
type: int
notnull: true
plik:
type: blob
notnull: true

WiarygodnoscCzytelnika:
options:
symfony:
form: false
filter: false
columns:
sf_guard_user_id:
type: integer(4)
notnull: true
unsigned: true
wiarygodnosc:
type: float
notnull: true
unsigned: true
default: 0

ZainteresowaniaCzytelnika:
options:
symfony:
form: false
filter: false
columns:
user_id:
type: integer
notnull: true
primary: true
zainteresowanie_id:
type: integer
notnull: true
primary: true
relations:
Czytelnik:
class: sfGuardUser
local: user_id
onDelete: CASCADE
foreignAlias: ZainteresowaniaCzytelnika
Zainteresowanie:
local: zainteresowanie_id
class: Dziedzina
onDelete: CASCADE
foreignAlias: ZainteresowaniaCzytelnika

Dziedzina:
options:
symfony:
filter: false
columns:
nazwa:
type: string(255)
notnull: true
unique: true
relations:
Zainteresowania:
class: sfGuardUser
refClass: ZainteresowaniaCzytelnika
foreignAlias: Zainteresowania
Specjalnosci:
class: sfGuardUser
refClass: SpecjalnosciAutora
foreignAlias: Specjalnosci
Tematyka:
class: Artykul
refClass: TematykaArtykulu
foreignAlias: Tematyka

SpecjalnosciAutora:
options:
symfony:
form: false
filter: false
columns:
autor_id:
type: integer
notnull: true
primary: true
specjalnosc_id:
type: integer
notnull: true
primary: true
relations:
Autor:
class: sfGuardUser
local: autor_id
onDelete: CASCADE
foreignAlias: SpecjalnosciAutora
Specjalnosc:
local: specjalnosc_id
class: Dziedzina
onDelete: CASCADE
foreignAlias: SpecjalnosciAutora


RangaAutora:
options:
symfony:
form: false
filter: false
columns:
user_id:
type: integer
notnull: true
ranga:
type: float
notnull: true
unsigned: true
default: 0

TematykaArtykulu:
options:
symfony:
form: false
filter: false
columns:
artykul_id:
type: integer
notnull: true
primary: true
tematyka_id:
type: integer
notnull: true
primary: true
relations:
Artykul:
onDelete: CASCADE
foreignAlias: TematykaArtykulu
Tematyka:
local: tematyka_id
class: Dziedzina
onDelete: CASCADE
foreignAlias: TematykaArtykulu



konto usunięte

Temat: [Doctrine & MySQL] Relacja many-to-many psuje zapytanie SQL.

Na przyszłość polecam projektować bazę przy użyciu MySql Workbench, ma on możliwość podpięcia zewnętrznej wtyczki konwertującej schemat na plik yml. Potem ręcznie można zmienić pewne detale, ale upraszcza to znacznie cały proces.
Piotrek Kaźmierczak

Piotrek Kaźmierczak sky is the limit...

Temat: [Doctrine & MySQL] Relacja many-to-many psuje zapytanie SQL.

nie wiedziałem, że taka wtyczka istnieje. Dzięki.

konto usunięte

Temat: [Doctrine & MySQL] Relacja many-to-many psuje zapytanie SQL.

Piotrek Kaźmierczak:
nie wiedziałem, że taka wtyczka istnieje. Dzięki.

zasadniczo są dwie, pierwsza http://code.google.com/p/mysql-workbench-doctrine-plugin/ jest stricte do aplikacji i udostępnia dodatkowe menu eksportu, druga możliwość to skrypt linii komend do konwersji pliku projektu mwb
Piotrek Kaźmierczak

Piotrek Kaźmierczak sky is the limit...

Temat: [Doctrine & MySQL] Relacja many-to-many psuje zapytanie SQL.

ja używałem visual architect, ale licencja się skończyła, poza tym tak średnio wyglądał ten wyeksportowany schemat,
wypróbuje to co mówisz
pzdr



Wyślij zaproszenie do