HK_92
HK_92

Reputation: 81

ManyToOne relationship retrieve data for each user

I am trying to develop a functionnality that each connected user could find a list of his favorite items or applications, in addition to that, he could create for each favorite application, one to many links for documentation or for FAQ. please find below the exemples space user1

space user2

I succeeded with the fact that to each user has his own applications and links but the links are not related to their application(s) : and duplicate the same links for all the applications result i couldn't find the issue, I will be thankfull for your help! here is my codes related to the link-APP relationship;

Link class

<?php

namespace Carto\cartographieBundle\Entity;

 use Doctrine\ORM\Mapping as ORM;

/**
 * LienDocUserApp
 *
 * @ORM\Table(name="lien_doc_user_app")
 * @ORM\Entity(repositoryClass="Carto\cartographieBundle\Repository\LienDocUserAppRepository")
 */
class LienDocUserApp
{
/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="nomLien", type="string", length=255)
 */
private $nomLien;

/**
 * @var string
 *
 * @ORM\Column(name="lien", type="string", length=255)
 */
private $lien;


/**
 * @ORM\ManyToOne(targetEntity="Application", inversedBy="liensDocUsersApp", cascade={"persist", "merge"})
 * @ORM\JoinColumns({
 *  @ORM\JoinColumn(name="Application_id", referencedColumnName="id")
 * })
 */
private $applications;

/**
 * @ORM\ManyToOne(targetEntity="AuthBundle\Entity\Users", inversedBy="liensDocUsersApp", cascade={"persist", "merge"})
 * @ORM\JoinColumns({
 *  @ORM\JoinColumn(name="User_id", referencedColumnName="id")
 * })
 */
private $fUsers;

Application class

<?php

namespace Carto\cartographieBundle\Entity;

use Carto\cartographieBundle\Repository\ApplicationRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * Application
 *
 * @ORM\Table(name="application")
 * @ORM\Entity(repositoryClass="Carto\cartographieBundle\Repository\ApplicationRepository")
 */
class Application
{

public function __toString() {
    
    return $this->nomApp;
    
}

/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="nomApp", type="string", length=255)
 */
private $nomApp;

.....
.....
/**
 * @ORM\OneToMany(targetEntity="LienDocUserApp", mappedBy="applications", cascade={"persist", "remove", "merge"})
 */
private $liensDocUsersApp;

.....

UserClass

<?php

namespace AuthBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class Users extends BaseUser
{
/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @ORM\ManyToMany(targetEntity="Carto\cartographieBundle\Entity\ProfilMetier", inversedBy="fUsers", cascade={"persist", "merge"})
 * @ORM\JoinTable(name="profilM_fUsers", joinColumns={@ORM\JoinColumn(name="User_id", referencedColumnName="id")},
 * inverseJoinColumns={@ORM\JoinColumn(name="ProfilM_id", referencedColumnName="id")})
 */  
private $profilsMetier;


/**
 * @ORM\ManyToMany(targetEntity="Carto\cartographieBundle\Entity\Application", inversedBy="fUsers", cascade={"persist", "merge"})
 * @ORM\JoinTable(name="App_fUsers", joinColumns={@ORM\JoinColumn(name="User_id", referencedColumnName="id")},
 * inverseJoinColumns={@ORM\JoinColumn(name="App_id", referencedColumnName="id")})
 */
private $applications;


/**
 * @ORM\OneToMany(targetEntity="Carto\cartographieBundle\Entity\LienDocUserApp", mappedBy="fUsers", cascade={"persist", "remove", "merge"})
 */
private $liensDocUsersApp;

public function __construct()
{

    parent::__construct();
    // your own logic
}

Controller

class AccueilController extends Controller {

public function indexAction(Request $request) {
    $em = $this->getDoctrine()->getManager();
    //affichage de toute les application et pour la recherche par profil
    $applications = $em->getRepository('CartoBundle:Application')->findAll();
    //recupération de l'utilisateur connecté
    $user = $this->get('security.token_storage')->getToken()->getUser();
    // récupération lien application et user
    $lienDocUserApp = $em->getRepository('CartoBundle:LienDocUserApp')->findAll();

return $this->render('CartoBundle:Accueil:index.html.twig', array(
                'applications' => $applications,
                 .......
                'user' => $user,
                'form' => $form->createView(),
                'formFile' => $formFile->createView(),
                'lienDocUserApp' => $lienDocUserApp,
                 .......

                
              
    ));
}

Twig File

<div class="tab-pane fade" id="profile-kv-3">
                            <table class="table table-striped table-hover" style="width:100%" >
                                <thead>
                                    <tr>
                                        <th>App</th>
                                        <th>Liens</th>
                                        <th>Fichiers</th>
                                    </tr>
                                </thead>
                                <tbody id="myTable">
                                    {%for application in user.applications%}
                                        <tr>
                                            <td style="width:33%">
                                                <div class="avatar-icon">
                                                    <a href="{{application.navigateur}}http: {{application.lien}}" target="blank"> <img src="{{ asset('bundles/carto/images/Applications/'~application.icone~'') }}" ></a>
                                                </div>
                                            </td>
                                            <td style="width:33%">
                                                {%for lien in user.liensDocUsersApp%}
                                                     <li>{{ lien.nomLien }}</li>
                                                {%endfor%}
                                            </td>
                                        </tr>
                                {%endfor%}
                                </tbody>
                            </table>
                        </div>

Upvotes: 0

Views: 45

Answers (1)

A.Amel
A.Amel

Reputation: 26

You only need a conditon for displayin the right links for the right app

{% for application in user.applications%}
    <tr>
        <td style="width:33%">
            <div class="avatar-icon">
                <a href="{{application.navigateur}}http: {{application.lien}}" target="blank">
                    <img src="{{ asset('bundles/carto/images/Applications/'~application.icone~'') }}"></a>
            </div>
        </td>
        <td style="width:33%">
            {%for lien in user.liensDocUsersApp%}
                {% if lien.applications.id == application.id %}
                    <li>{{ lien.nomLien }}</li>
                {% endif %}
            {% endfor %}
        </td>
    </tr>
{% endfor %}

Upvotes: 1

Related Questions