• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Symfony zapytania mysql

Object Storage Arubacloud
0 głosów
237 wizyt
pytanie zadane 9 lipca 2019 w PHP przez michal_php Stary wyjadacz (13,700 p.)

Cześć.

Nie wiem co robię źle ,ale nie umiem sobie poradzić. Staram się podpiąć w Doctrine get i set aby móc pobrać wszystko za jednym id , ale nie wiem co robię źle.

Twig:

{% extends 'master.html.twig' %}
{% block body %}
    <div class="col-md-6 col-md-offset-3">
        {% for one in take %}
            <div class="test">
                <p class="float-left">nazwa{{ one.customName }}</p>
                <div class="float-left">
                    <a href="{{ url('auto_createpdf',{'id':one.id}) }}">testuj</a>
                </div>
                <p>mixture.cas:{{ one.Mixture.cas }}</p>
                <p>mixture.name{{ one.Mixture.name }}</p>
                <p>copmany.name{{ one.Company.name }}</p>
                <p>hp:{{ one.HPhrase.name }}</p>
            </div>
        {% endfor %}
    </div>
{% endblock %}

Controller:

 public function autopdfAction()
    {
       /*$entityManager = $this->getDoctrine()->getManager();
       $take = $entityManager->getRepository(CompanyMixture::class)->findAll();*/

       $entityManager = $this->getDoctrine()->getManager();
       $take = $entityManager -> getRepository(CompanyMixture::class)->findBy(['nr'=>2]);

        return $this->render('GeneratorPDF/index.html.twig',['take'=>$take]);
    }

klasa: companymixture:

class CompanyMixture
{
    /** @var Id */
    private $id;

    /** @var MsdsFile */
    private $msdsFile;

    /** @var GenericMixture */
    private $genericMixture;

    /**
     * @var HPhrase
     */
    private $hPhrase;

    /** @var Company */
    private $company;

  /**
     * @param Id $id
     * @param MsdsFile $msdsFile
     * @param Mixture $genericMixture
     * @param Company $company
     * @param HPhrase $hPhrase
     * @param null|string $additionalDescription
     */
    public function __construct(
        Id $id,
        ?MsdsFile $msdsFile,
        GenericMixture $genericMixture,
        Company $company,
        HPhrase $hPhrase,
        ?string $additionalDescription = '',
        ?int $nr = null
        
    ) {
        $this->id = $id;
        $this->msdsFile = $msdsFile;
        $this->genericMixture = $genericMixture;
        $this->company = $company;
        $this->hPhrase = $hPhrase;
        $this->additionalDescription = $additionalDescription;

        $this->createdAt = new \DateTime();
        $this->maxUsage = 0.0;

        $company->incrementMixtureCounter();
        if ($nr) {
            $this->nr = $nr;
        } else {
            $this->nr = $company->getMixtureCounter();
        }
    }
 /**
     * @return HPhrase
     */
    public function getHPhrase(): HPhrase
    {
        return $this->hPhrase;
    }

    /**
     * @param HPhrase $hPhrase
     */
    public function setHPhrase(HPhrase $hPhrase)
    {
        $this->hPhrase = $hPhrase;
    }

i klasa HPhrase :

 /** @var Collection */
    private $companyMixtures;
 /**
     * @param Id $id
     * @param string $name
     * @param bool $cmr
     * @param CmrType $cmrType
     * @param null|string $cmrDescription
     * @param OrchCategory $orchCategory
     * @param OrchRisk $orchRisk
     * @param int $nr
     */
    public function __construct(
        Id $id,
        string $name,
        bool $cmr,
        ?CmrType $cmrType,
        ?string $cmrDescription,
        ?OrchCategory $orchCategory,
        ?OrchRisk $orchRisk,
        int $nr = 0
    ) {
        $this->id = $id;
        $this->name = $name;
        $this->cmr = $cmr;
        $this->cmrType = $cmrType->id();
        $this->cmrDescription = $cmrDescription;
        $this->orchCategory = $orchCategory->id();
        $this->orchRisk = $orchRisk->id();
        $this->companyMixtures = new ArrayCollection();
        $this->nr = $nr;

        $this->createdAt = new \DateTime();
    }
 /**
     * @return Collection|ArrayCollection
     */
    public function getCompanyMixtures()
    {
        return $this->companyMixtures;
    }

    /**
     * @param $companyMixture
     */
    public function addCompanyMixture($companyMixture)
    {
        $this->companyMixtures->add($companyMixture);
    }

i błąd:

Type error: Return value of Chemiq\Domain\Model\Mixture\CompanyMixture::getHPhrase() must be an instance of Chemiq\Domain\Model\Dictionary\HPhrase, null returned

komentarz 9 lipca 2019 przez michal_php Stary wyjadacz (13,700 p.)

Dla rozjaśnienia.Staram się w klasie companymixture podpiąć pod set i get klasę HPhrase .Aby w twig można od razu po wpisany

 <p>hp:{{ one.HPhrase.name }}</p>

Móc odwołać się do klasy HPhrase i jej kolumny o nazwie name  

1 odpowiedź

+2 głosów
odpowiedź 10 lipca 2019 przez CenterPL Pasjonat (19,070 p.)
Komunikat mówi jasno, getter oczekuje, że zwróci HPhrase, tymczasem jest tam null. Gdzie masz mapowanie tej encji? Bez tego będziemy wróżyć z fusów.
komentarz 10 lipca 2019 przez michal_php Stary wyjadacz (13,700 p.)

Dziękuje za odpowiedź.Kod mapowania encji HPhrase(nie jestem pewny ,ale to chyba jest mapowanie encji ?):

<?php

namespace Chemiq\Domain\Model\Dictionary;

use Chemiq\Shared\Model\Pagination\Data\PaginationData;
use Knp\Component\Pager\Pagination\PaginationInterface;

interface HPhrases
{
    /**
     * @return HPhrase[]
     */
    public function findAllActive(): array;

    /**
     * @return PaginationInterface
     */
    public function findAllActivePaginated(PaginationData $paginationData): PaginationInterface;

    /**
     * @param string $name
     *
     * @return HPhrase|null
     */
    public function findByName(string $name): ?HPhrase;

    /**
     * @param HPhrase $hPhrase
     */
    public function add(HPhrase $hPhrase): void;
}

i mapowanie companymixture:

<?php

declare(strict_types = 1);

namespace Chemiq\Domain\Model\Mixture;

use Chemiq\Domain\Model\Company\Company;

interface CompanyMixtures
{
    /**
     * @param Company $company
     *
     * @return array|CompanyMixture[]
     */
    public function findForCompany(Company $company): array;

    /**
     * @param Company $company
     *
     * @return array|CompanyMixture[]
     */
    public function findCurrentForCompany(Company $company): array;

    /**
     * @param CompanyMixture $mixture
     */
    public function add(CompanyMixture $mixture);

    /**
     * @param GenericMixture $genericMixture
     *
     * @return ?CompanyMixture
     */
    public function findByGenericMixture(GenericMixture $genericMixture, Company $department): ?CompanyMixture;
}

 

komentarz 11 lipca 2019 przez CenterPL Pasjonat (19,070 p.)

cóż, to nie jest mapowanie encji, to jest interfejs repozytorium, który absolutnie nie pomoże, bynajmniej nie teraz. 

Mapowanie możesz robić na kilka sposobów, albo w tym samym pliku co encja w adnotacjach (najczęstszy sposób i najmniej lubiany przeze mnie), w plikach yaml czy też xml (osobiście to bym zalecał). Obstawiam, że tego nie masz, jeżeli wkleiłeś cały kod encji. Wyglądasz mi raczej na osobę początkującą więc zakładam, że nigdzie indziej tego mapowania nie trzymasz. 

Tutaj więc masz materiały do poczytania:

https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/basic-mapping.html

https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/association-mapping.html#association-mapping

To drugie to rozwiązanie Twojego problemu na 90%, ale przeczytaj najpierw pierwsze, bo w ogóle musisz obczaić o co chodzi.

komentarz 11 lipca 2019 przez michal_php Stary wyjadacz (13,700 p.)

Znalazłem mapping w xml:

CompanyMixture:

<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
                  xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
    <entity name="Chemiq\Domain\Model\Mixture\CompanyMixture" table="company_mixtures">
        <id name="id" type="guid" column="id">
            <generator strategy="NONE"/>
        </id>
        <field name="status" type="integer" column="status" nullable="true"/>
        <field name="statusDescription" type="string" column="status_description" length="2000" nullable="true"/>
        <field name="additionalDescription" type="string" column="additional_description" length="2000"
               nullable="true"/>
        <field name="createdAt" type="datetime" column="created_at" nullable="false"/>
        <field name="maxUsage" type="float" column="max_usage" nullable="false" default="0"/>
        <field name="nr" type="integer" column="nr" nullable="false"/>
        <field name="usagePlace" type="string" column="usage_place" length="200" nullable="true"/>
        <field name="customName" type="string" column="custom_name" length="200" nullable="true"/>

        <many-to-many field="usagePlaces" target-entity="Chemiq\Domain\Model\Mixture\UsagePlace"
                      mapped-by="companyMixtures">
            <cascade>
                <cascade-persist/>
                <cascade-remove/>
            </cascade>
        </many-to-many>

        <!-- TODO remove this field -->
        <many-to-one target-entity="Chemiq\Domain\Model\Characteristics\MsdsFile" field="msdsFile" nullable="true">
            <join-columns>
                <join-column name="msds_file_id" referenced-column-name="id"/>
            </join-columns>
        </many-to-one>

        <many-to-one target-entity="Chemiq\Domain\Model\Mixture\GenericMixture" field="genericMixture"
                     inversed-by="companyMixtures">
            <join-columns>
                <join-column name="generic_mixture_id" referenced-column-name="id"/>
            </join-columns>
            <cascade>
                <cascade-persist/>
            </cascade>
        </many-to-one>
        <many-to-one target-entity="Chemiq\Domain\Model\Company\Company" field="company" inversed-by="companyMixtures">
            <join-columns>
                <join-column name="company_id" referenced-column-name="id"/>
            </join-columns>
            <cascade>
                <cascade-persist/>
            </cascade>
        </many-to-one>
        <one-to-many target-entity="Chemiq\Domain\Model\Mixture\MixtureAssent" mapped-by="mixture" field="assents"
                     orphan-removal="true">
            <cascade>
                <cascade-remove/>
                <cascade-persist/>
            </cascade>
        </one-to-many>
        <one-to-many target-entity="Chemiq\Domain\Model\ExtraAttribute\ExtraAttributeValue" mapped-by="companyMixture"
                     field="extraFields" orphan-removal="true">
            <cascade>
                <cascade-remove/>
                <cascade-persist/>
            </cascade>
        </one-to-many>
        <one-to-many target-entity="Chemiq\Domain\Model\Mixture\MixtureDocument" mapped-by="companyMixture"
                     field="documents" orphan-removal="true">
            <cascade>
                <cascade-remove/>
                <cascade-persist/>
            </cascade>
        </one-to-many>
        <one-to-many target-entity="Chemiq\Domain\Model\Mixture\MixtureUsage" mapped-by="companyMixture"
                     field="mixtureUsages" orphan-removal="true">
            <cascade>
                <cascade-remove/>
                <cascade-persist/>
            </cascade>
        </one-to-many>

    </entity>
</doctrine-mapping>

i HPhrase

<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
                  xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
    <entity name="Chemiq\Domain\Model\Dictionary\HPhrase" table="dictionary_hphrase">
        <id name="id" type="guid" column="id">
            <generator strategy="NONE"/>
        </id>
        <field name="name" type="string" column="name" length="255" nullable="true"/>
        <field name="cmr" type="boolean" column="cmr"/>
        <field name="cmrType" type="smallint" column="cmr_type"/>
        <field name="cmrDescription" type="string" column="cmr_description" length="2000" nullable="true"/>
        <field name="orchCategory" type="smallint" column="orch_category"/>
        <field name="orchRisk" type="smallint" column="orch_risk"/>
        <field name="createdAt" type="datetime" column="created_at"/>
        <field name="deletedAt" type="datetime" column="deleted_at" nullable="true"/>
        <field name="oldName" type="string" column="old_name" length="255" nullable="true"/>
        <field name="nr" type="integer" column="nr" nullable="false" default="0"/>

        <one-to-many field="zzrClassifications" target-entity="Chemiq\Domain\Model\Dictionary\ZzrClassification"
                     mapped-by="type"/>
    </entity>
</doctrine-mapping>

 

komentarz 11 lipca 2019 przez CenterPL Pasjonat (19,070 p.)
Okej w pliku z mapowaniem CompanyFixture nie ma w ogóle mapowania dla pola HPhrase więc to pole pewnie nie istnieje w bazie, no i pole jest puste, czyli ma null jako wartość.
komentarz 11 lipca 2019 przez michal_php Stary wyjadacz (13,700 p.)
To by miało sens, ale jak zatem mogę sie inaczej dobrać do tej tabeli w wysql? czy tylko poprzez stworzenie nowego odwołana? Czy jest inny sposób?
komentarz 11 lipca 2019 przez CenterPL Pasjonat (19,070 p.)
Chyba nie bardzo rozumiem o co pytasz? Musisz zrobić mapowanie. Jeśli masz tabelę w bazie, to dodajesz relacje w Twoim xml'u i tyle.
komentarz 11 lipca 2019 przez michal_php Stary wyjadacz (13,700 p.)
Ale jak dodam nowa relacje to pola będę puste? Muszę je zapełnić.Bo moja tabela juz ma około 300 wpisów
komentarz 11 lipca 2019 przez CenterPL Pasjonat (19,070 p.)
tak, będzie pusta. Tak na logikę, widzisz jakąś inną magiczną możliwość? To nadal komputer i sam się nie domyśli co sobie z tym zrobić. Także po prostu potem w bazie danych ręcznie będziesz musiał wypełnić albo napisać jakiś update'ujący skrypt.

Podobne pytania

0 głosów
0 odpowiedzi 123 wizyt
pytanie zadane 29 lipca 2019 w PHP przez michal_php Stary wyjadacz (13,700 p.)
–1 głos
0 odpowiedzi 86 wizyt
pytanie zadane 21 czerwca 2019 w PHP przez michal_php Stary wyjadacz (13,700 p.)
0 głosów
3 odpowiedzi 887 wizyt
pytanie zadane 12 października 2017 w PHP przez Kamil Gąsior Obywatel (1,430 p.)

92,568 zapytań

141,424 odpowiedzi

319,634 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...