Hirdetés

Keresés

Új hozzászólás Aktív témák

  • _ak_

    addikt

    Sziasztok!

    Lenne egy gyakorló feladatom, de kicsit akadozik a megfejtése.
    Adott egy rendelések xml fájl, és ennek megfelelően kéne relációs táblákat létrehozni MySQL-ben normalizálva és minimalizálva a redundanciát.

    Az alap táblákig nagyjából világos a helyzet:

    Customers
    -id
    -name
    -email
    -telephone

    Products
    -id
    -item_code
    -item_cc_code
    -item_name
    -vtsz
    -unit
    -unit_price_netto

    Gondolom, célszerű külön a Shipping és Billing táblákat is létrehozni, pl:

    Shipping
    -id
    -customer_id
    -name
    -country
    -postcode
    -city
    -street
    -telephone

    Bár ez esetben a HU és a Budapest, már valószínűleg többször szerepelne, szóval esetleg azokat lehetne egy Cities táblába menteni
    -id
    -country
    -post_code
    -city

    és a shippingn táblába a country helyett city_id lenne.

    Ez eddig nagyjából jó?

  • _ak_

    addikt

    válasz mobal #1574 üzenetére

    Ezt olvastam már, köszönöm, csak én összemostam a két dolgot.

    A Framework külön dolgozik a MySql szervertől.

    Foreing_key megadása nélkül is működnek a relációk, persze jelen esetben csak akkor automatikus, ha a megfelelő elnevezéséket használunk.

    Továbbá a MyIsam is tudja értelmezni a FK-t, csak a hozzá tartozó megkötéseket nem. Így hiába törlök egy felhasználót, a kutyák gyerek táblán, nem történik semmi változás.
    Tehát törléskor külön kéne még egy query a kutya táblában a user_id-re és úgy lehetne törölni a hozzá tartozó kutyákat is.

    És igaz mi igaz, elég pontatlanul is fogalmaztam. Ebből a szempontból az ORM egy hadik játékos, a lekérdezéseknek csak közvetve van köze a beállított relációkhoz.

    Tehát esetemben most, azért kell InnoDB és FK, hogy könnyebb módon törölhessek egy felhasználót kutyástul. Továbbá nem egy eget rengető dolog, de így a megkötések révén, programhiba/akármi esetén sem, tud mondjuk rossz megyéhez kerülni egy település.

    Persze az eredeti hibát nem sikerült még kijavítanom, de legalább tudom, hogy valószínűleg az ORM-el kapcsolatos a jelenség és nem konkrétan az adatbázissal van baj.

  • _ak_

    addikt

    válasz Speeedfire #1572 üzenetére

    Ez így már világosabb akkor, köszi!

    Viszont az továbbra is rejtély, hogy miért nem működik az admin ellenőrzés, máshol is van még egy-egy ilyen if, igaz nem a controllerben, de hasonló a funkció és hibátlanul működik:

    @if($dog->user_id === Auth::id())

    Ránézésre a host és a vagrant box-om közti különbség a MySQL verziója 5.1-5.5 és tároló motor, de hoston az a két if nem igazán működik úgy, ahogy kéne.

  • _ak_

    addikt

    válasz Speeedfire #1570 üzenetére

    Na de nem pont az a lényege az ORM használatának, hogy előredefiniált táblarelációk vannak az idegen kulcsokon keresztül? Máskülönben hogyan határozódik meg a reláció?

    Ezt félretéve nagyjából értem amit mondasz, amennyiben a úgy érthetem, hogy a relációk az alkalmazáson belül kerülnek beállításra és az InnoDB motornak pedig sebességi előnye lesz, ha megadjuk, hogy melyek az idegen kulcsok egy másik táblából.

    Nem akarok hülyeséget kérdezni, nem hogy írni, csak azt hittem, hogy ha nincsen meghatározva az idegen kulcs, akkor az ORM használatát is bukom.

  • _ak_

    addikt

    Számomra egy kicsit furcsa helyzet előtt állok.
    Van egy webalkalmazásom, aminek a fejlesztése közben MySQL-t és InnoDB-t használtam. A tábláim többségében van idegen kulcs, ami(k) segítségével van meghatározva az egyes táblák közti reláció.
    Ezt az adatbázist szőröstül-bőröstül exportáltam, majd importáltam egy MyISAM motorral működő MySQL-be és szinte minden ugyan úgy működik.
    Nem értem, hogy miért és hogyan. A MyISAM nem támogatja az idegen kulcsokat, az egymáshoz fűződő adatokat mégis le tudom kérni.
    Kicsit tartok attól, hogy olyan a helyzet, mint matekban, amikor rossz számolás után jó eredmény jön ki,...legalább 2-szer hibáztam.

    A dolog egyébként úgy tűnt fel, hogy kettő if-em hibásan fut le:

    if (Auth::user()->admin === 1)
    {

    return Redirect::route('admin.index');

    } else...

    , illetve

    if ($id === Auth::id() or Auth::user()->admin === 1)

    Mindkettő esetében az admin rész mindig false.

    Kaphatnék ebben egy kis felvilágosítást?

  • _ak_

    addikt

    válasz Speeedfire #1559 üzenetére

    Parancsolj:

    (SQL:
    select count(*) as aggregate from `dogs` where `gender` = szuka
    or
    (select count(*) from `dog_breeds` where `dogs`.`dog_breed_id` = `dog_breeds`.`id` and `dog_breed` LIKE %szuka%) >= 1
    or
    (select count(*) from `counties` where `dogs`.`county_id` = `counties`.`id` and `county` LIKE %szuka%) >= 1
    or
    (select count(*) from `settlements` where `dogs`.`settlement_id` = `settlements`.`id` and `settlement` LIKE %szuka%) >= 1
    )

    martonx: De még mennyire, hogy hasznos. Noha a Laravel dokumentációban nem túl erős, ezt párosítva a tapasztalatlanságommal, sokszor, ha előttem van vmi, akkor sem vagyok benne biztos, hogy az az amit keresek, lásd a fenti helyzetet. Eloquent query alatt ez is ott van, de egyszerűen túlmentem rajta, amíg nem találtam egy könnyen érthető példát a neten.
    Ebben szerencsére jók, a hypenak köszönhetően nagyon sok talált van, csak tudjam, hogy mit is akarok pontosan. :)

  • _ak_

    addikt

    válasz _ak_ #1556 üzenetére

    Azt hiszem sikerült az eredeti elképzelésem.

    'whereHas' kellett neki:

    $dogs = Dog::where('gender', '=', "$search")
    ->orWhereHas('dogBreed', function ($query) use ($search)
    {
    $query->where('dog_breed', 'LIKE', "%$search%");
    })
    ->orWhereHas('county', function ($query) use ($search)
    {
    $query->where('county', 'LIKE', "%$search%");
    })
    ->orWhereHas('settlement', function ($query) use ($search)
    {
    $query->where('settlement', 'LIKE', "%$search%");
    })
    ->get();

    Nem hittem volna, hogy ennyit fogok elidőzni már az elején. ;]

  • _ak_

    addikt

    válasz Speeedfire #1555 üzenetére

    Úgy tűnik, hogy szépen elakadtam.

    Félig meddig sikerült valamit összehoznom, viszont azzal együtt jött vmi tábla ütközés, mert fals értékek jelentek meg. Itt az első postomban leírtam, hogy mi volt az ami látszólagosan működött.

    Amúgy a model relációim működnek, szóval le tudom kérdezni a kutya fajtát vagy a hozzátartozó települést egy egyszerű '$dog->dog_breed'-el, ill. a kutyák táblában is tudok keresni 'LIKE'-al, de ilyen keresést nem tudok kiterjeszteni a hozzátartozó táblákra.

    Most nekifutok még egyszer joinnak, hátha frissebb fejjel más lesz az eredmény.

    És közben most kaptam egy tippet, hogy scope query-t is nézzem meg, ill. az eager loadingot.

  • _ak_

    addikt

    válasz Speeedfire #1553 üzenetére

    Valami összejött, de felvetett jó pár kérdést.

    Elsőnek engem a sorrendiség zavart meg. Mivel a kutyák táblám tartalmaz minden infót vagy inkább kapcsolódó 'id'-t, ezért azt hittem, hogy a kutya táblához kell hozzákötni a többit, de most a 'users' táblához kötöttem a 'dogs' táblát, méghozzá a 'user.id', '=', 'dogs.user_id'.

    Meg is kapom szépen a keresett infókat. Igen ám, de van még 'county, settlements,dog_breeds' táblám is, ezeket már nem tudom, így hozzákötni a 'users' táblámhoz. Szóval nem működhet ez valahogy visszafelé is?

    Mindenesetre még túrom a Laravel doc.-ot, mert 2 dolog is feltűnt. A fenti DB queryt használva másképp kapom meg az adatokat, mint a Laraveles Eloquent-tel.

    Eloquenttel a kapott eredmény:

    Dog:with('county', 'settlement')->get(); eredménye:

    id:
    breed:
    county_id:
    settlement_id (és folytatásként külön tömbben a 'county', majd megint különben a 'settlement'
    id:
    county:
    .
    .
    .

    Míg a DB query join után egyben volt minden, tehát tényleg, mintha egy táblából olvastam ki volna mindent.

  • _ak_

    addikt

    Sziasztok!

    Laravel-ben szeretnék egy kereső mezőt létrehozni, amibe a beírt szöveg(részlet)nek megfelelően, visszakapok egy tömböt.

    Tehát mondjuk, ha beírom, hogy kan, akkor adja vissza az összes 'kan' nemű kutyát, meg azokat is amik pl. Kaskantyú-n vannak.

    Hogy szokás egy ilyen keresést kivitelezni?

    Az adatbázisok közötti reláció be van állítva és le tudom hívni az összes egymáshoz tartozó információt, de nem tudom, hogy hogyan kereshetnék a hozzátartozó adatbázisban. A kutyák táblába a pl. a megye táblára csak a megye azonosítója szerepel

    Eddig ilyesmivel próbálkoztam, de mivel nincsen county mező a kutya táblámon ezért ez így nem működik.

    $dogs = Dog::with('county')
    ->where('gender', 'LIKE', "%$search%")
    ->orWhere('county', 'LIKE', "%$search%")
    ->paginate(8);

    Feltételezem, hogy valami JOIN kéne nekem, de egyszerűen most nem tudom megérteni annak a működését.

    Irányba tudna valaki állítani? :R

    Így hirtelen azt hiszem, hogy kereshetnék külön külön is a táblákban, de végeredménybe én azt szeretném, hogy minden egy tömbben legyen tovább adta a View-nak.

Új hozzászólás Aktív témák