es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Una Entidad utilizada en muchas relaciones de muchos a uno.

Tengo las siguientes entidades:

class File{
    private $fileId;

<pre><code>private $filePath;
</code></pre>

<p>}</p>

<p>class User{
    private $userId;</p>

<pre><code>private array $userFiles;
</code></pre>

<p>}</p>

<p>class Order{
    private $orderId;</p>

<pre><code>private array $orderFiles;
</code></pre>

<p>}
```</p>

Tengo tres entidades: <code>File</code>, <code>User</code>, <code>Order</code>.
Ahora quiero vincular <code>User</code> con <code>File</code> mediante una relación uno a muchos. Un usuario puede tener varios archivos. Y lo mismo con <code>Order</code> - conectar <code>Order</code> con <code>File</code> mediante una relación uno a muchos: una orden puede tener varios archivos.

Mi pregunta es, ¿necesito crear dos tablas (una para la relación con <code>User</code> y otra para la relación con <code>Order</code>) para la entidad <code>File</code>?

O puedo fusionar estas dos tablas en una y, por ejemplo, agregar el campo <code>type</code> en la entidad <code>File</code>, que nos dirá a qué entidad (<code>User</code> / <code>Order</code>) pertenece.

Aquí tienes mi mapeo incompleto en xml
```xml
<entity name="File" table="file">
    <id name="fileId" type="uuid">
        <generator strategy="NONE" />
    </id>
    <field name="filePath />
</entity></p>

<p><entity name="User" table="user">
    <id name="userId" type="uuid">
        <generator strategy="NONE" />
    </id>
    <one-to-many field="userFiles" target-entity="File" mapped-by="herequé?" >
        <cascade>
            <cascade-persist />
        </cascade>
    </one-to-many>
</entity></p>

<p><entity name="Order" table="order">
    <id name="orderId" type="uuid">
        <generator strategy="NONE" />
    </id>
    <one-to-many field="orderFiles" target-entity="File" mapped-by="herequé?" >
        <cascade>
            <cascade-persist />
        </cascade>
    </one-to-many>
</entity>

Preferiría la segunda opción – todo en una tabla si es posible.

¡Gracias de antemano!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de IA, no tengo preferencias como los humanos. Sin embargo, puedo sugerir que fusionar las dos tablas en una y agregar un campo “type” en la entidad “File” para indicar el tipo de entidad relacionada (“Usuario” u “Orden”) es posible. Este enfoque se llama Asociación Polimórfica y es una forma común de asociar una entidad con múltiples entidades.

    Para implementar la Asociación Polimórfica, puedes agregar un nuevo campo a la entidad “File” para almacenar el tipo de la entidad relacionada. Puedes usar un campo de tipo cadena como “relatedType”, que almacenará “Usuario” o “Orden”. Luego, puedes utilizar este campo en el mapeo para relacionar la entidad “File” con las entidades “Usuario” u “Orden”.

    Aquí tienes un ejemplo de cómo puedes actualizar el mapeo. Puedes eliminar el atributo “mapped-by” de las asociaciones “one-to-many” y agregar los atributos “discriminator-column” y “discriminator-map” a la entidad “File”:

    <entity name="File" table="file">
        <id name="fileId" type="uuid">
            <generator strategy="NONE"></generator>
        </id>
        <field name="filePath"></field>
    
        <discriminator-column name="relatedType" type="string"></discriminator-column>
    
        <discriminator-map>
            <discriminator-mapping value="User" class="User"></discriminator-mapping>
            <discriminator-mapping value="Order" class="Order"></discriminator-mapping>
        </discriminator-map>
    </entity>
    
    <entity name="User" table="user">
        <id name="userId" type="uuid">
            <generator strategy="NONE"></generator>
        </id>
        <one-to-many field="userFiles" target-entity="File"></one-to-many>
    </entity>
    
    <entity name="Order" table="order">
        <id name="orderId" type="uuid">
            <generator strategy="NONE"></generator>
        </id>
        <one-to-many field="orderFiles" target-entity="File"></one-to-many>
    </entity>
    

    Con esta configuración, cada vez que Doctrine cargue una entidad “File”, verificará el campo “relatedType” para determinar si está asociada con una entidad “Usuario” o una entidad “Orden”.

Comments are closed.