(Desculpem minha pergunta incoerente: tentei responder algumas perguntas enquanto escrevia este post, mas aqui está :)
Estou tentando criar um modelo de banco de dados com um relacionamento muitos para muitos dentro de uma tabela de links, mas que também tem um valor por link, neste caso uma tabela de manutenção de estoque. (este é um exemplo básico para mais problemas que estou tendo, mas pensei em testá-lo antes de continuar).
Usei exportmwb para gerar as duas Entidades Store e Product para este exemplo simples, ambas são exibidas abaixo.
No entanto, o problema agora é que não consigo descobrir como acessar o valor stock.amount (int assinado, pois pode ser negativo) usando o Doctrine. Além disso, quando tento criar as tabelas usando orm: schema-tool: create function da doutrina
Isso resultou em apenas duas Entidades e três tabelas, uma como uma tabela de link sem valores e duas tabelas de dados, já que relacionamentos muitos para muitos não são entidades em si, então só posso ter Produto e Loja como uma entidade.
Então, logicamente, tentei mudar meu modelo de banco de dados para ter estoque como uma tabela separada com relacionamentos para armazenamento e produto. Também reescrevi os nomes dos campos apenas para poder excluí-los da origem do problema:
Então o que eu descobri foi que ainda não recebi uma entidade Stock ... e o próprio banco de dados não tinha um campo 'quantidade'.
Eu realmente precisava ser capaz de juntar essas lojas e produtos em uma tabela de estoque (entre outras coisas) ... então, apenas adicionar o estoque ao produto em si não é uma opção.
root@hdev:/var/www/test/library# php doctrine.php orm:info
Found 2 mapped entities:
[OK] Entity\Product
[OK] Entity\Store
E quando eu crio o banco de dados, ele ainda não me fornece os campos certos na tabela de estoque:
Então, procurando algumas coisas aqui, descobri que conexões muitos para muitos não são entidades e, portanto, não podem ter valores. Tentei mudá-la para uma tabela separada com relacionamentos com as outras, mas ainda não funcionou.
O que eu estou fazendo errado aqui?
fonte
Respostas:
Uma associação Muitos-para-muitos com valores adicionais não é um Muitos-para-muitos, mas sim uma nova entidade, pois agora tem um identificador (as duas relações com as entidades conectadas) e valores.
Essa também é a razão pela qual as associações Muitos para Muitos são tão raras: você tende a armazenar propriedades adicionais nelas, como
sorting
,amount
, etc.O que você provavelmente precisa é algo como seguir (eu tornei ambas as relações bidirecionais, considere tornar pelo menos uma delas unidirecional):
Produtos:
namespace Entity; use Doctrine\ORM\Mapping as ORM; /** @ORM\Table(name="product") @ORM\Entity() */ class Product { /** @ORM\Id() @ORM\Column(type="integer") */ protected $id; /** ORM\Column(name="product_name", type="string", length=50, nullable=false) */ protected $name; /** @ORM\OneToMany(targetEntity="Entity\Stock", mappedBy="product") */ protected $stockProducts; }
Loja:
namespace Entity; use Doctrine\ORM\Mapping as ORM; /** @ORM\Table(name="store") @ORM\Entity() */ class Store { /** @ORM\Id() @ORM\Column(type="integer") */ protected $id; /** ORM\Column(name="store_name", type="string", length=50, nullable=false) */ protected $name; /** @ORM\OneToMany(targetEntity="Entity\Stock", mappedBy="store") */ protected $stockProducts; }
Estoque:
namespace Entity; use Doctrine\ORM\Mapping as ORM; /** @ORM\Table(name="stock") @ORM\Entity() */ class Stock { /** ORM\Column(type="integer") */ protected $amount; /** * @ORM\Id() * @ORM\ManyToOne(targetEntity="Entity\Store", inversedBy="stockProducts") * @ORM\JoinColumn(name="store_id", referencedColumnName="id", nullable=false) */ protected $store; /** * @ORM\Id() * @ORM\ManyToOne(targetEntity="Entity\Product", inversedBy="stockProducts") * @ORM\JoinColumn(name="product_id", referencedColumnName="id", nullable=false) */ protected $product; }
fonte
O Doctrine lida muito bem com relacionamentos muitos para muitos.
O problema que você está tendo é que você não precisa de uma associação ManyToMany simples, porque as associações não podem ter dados "extras".
Sua tabela intermediária (estoque), uma vez que contém mais do que product_id e store_id, precisa de sua própria entidade para modelar esses dados extras.
Então você realmente quer três classes de entidade:
e duas associações:
fonte
php app/console doctrine:mapping:import AppBundle yml
para importar o esquema do banco de dados. Eu gostaria que ele gerasse esse arquivo yaml de mapeamento extra. Alguém tem alguma ideia?:(