如果实体存在于数组中,则显示添加或删除按钮。

3

我有三个实体 TravelFavoriteUser,每个用户都可以将旅行添加到他的收藏列表中。

当显示所有旅行列表时,如果旅行已经在用户的收藏夹中,则显示一个“移除”按钮;如果不在列表中,则显示“添加到收藏夹”按钮。

在操作控制器中,我使用查询构建器获取当前已认证用户的所有收藏列表,并将结果放入 ($favorite) 变量中。

    public function listAction($page, Request $request)
    {
    $em = $this->getDoctrine()->getManager();

    // code of boutton add to or remove from favorite
    $user = $this->getUser(); // this is a function to verify if user is AUTHENTICATED_REMEMBERED
    if($user) {
    $favorite = $em->getRepository('ProjectTravelBundle:Favorite')->getFavoriteByUser($user);
    }
    else{
    $favorite = '';
    }

    $paginator  = $this->get('knp_paginator');

    $qb = $em->getRepository('ProjectTravelBundle:Travel')->getListTravelsFrontend();
    $nb = $qb->getQuery()->getResult();

    $pagination = $paginator->paginate(
        $qb,
        $request->query->get('page', $page),10);


    return $this->render('ProjectFrontendBundle:Travel:travel-list-view.html.twig',array(
        'pagination' => $pagination,
        'nb' => $nb,
        'favorite' =>$favorite, // list of favorites of current user 
    ));
}

我认为的解决方案是测试旅行是否在数组收藏夹中 (favorite),如果是则显示删除按钮,否则显示添加按钮,但我无法在 show.twig 中实现这一点。

{% for travel in pagination %}
//..................

{% if is_granted('IS_AUTHENTICATED_REMEMBERED') %}

{% if travel.id not in favorite %}
    <span><a href="{{ path('frontend_travel_add_favorite', {'id': travel.id} ) }}" class="pull-right button btn-small red">Add to favorite</a></span>
{% else %}
    <span><a href="{{ path('frontend_travel_delete_favorite', {'id': favorite.id} ) }}" class="pull-right button btn-small red">Remove from</a></span>
{% endif %}

// if user is not AUTHENTICATED_REMEMBERED
{% else %}
<span><a href="{{ path('frontend_travel_add_favorite', {'id': travel.id} ) }}" class="pull-right button btn-small red">Add to favorite</a></span>
{% endif %}

//..........
{% endfor %}

代码库: queryBuilder

    // get list of favorite of current user
    public function getFavoriteByUser($user)
    {
        $qb = $this->createQueryBuilder('f')
            ->Where('f.user = '.$user);

        return $qb->getQuery()->getResult();
    }

更新

FavoriteEntity(收藏实体)

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

/**
 * @ORM\ManyToOne(targetEntity="Project\UserBundle\Entity\User")
 * @ORM\JoinColumn(nullable=false)
 */
protected $user;

/**
 * @ORM\ManyToOne(targetEntity="Project\TravelBundle\Entity\Travel", inversedBy="favorites")
 * @ORM\JoinColumn(nullable=false)
 */
protected $travel;


/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}

/**
 * Set user
 *
 * @param \Project\UserBundle\Entity\User $user
 * @return Favorite
 */
public function setUser(\Project\UserBundle\Entity\User $user)
{
    $this->user = $user;

    return $this;
}

/**
 * Get user
 *
 * @return \Project\UserBundle\Entity\User 
 */
public function getUser()
{
    return $this->user;
}


/**
 * Set travel
 *
 * @param \Project\TravelBundle\Entity\Travel $travel
 * @return Favorite
 */
public function setTravel(\Project\TravelBundle\Entity\Travel $travel)
{
    $this->travel = $travel;

    return $this;
}

/**
 * Get travel
 *
 * @return \Project\TravelBundle\Entity\Travel 
 */
public function getTravel()
{
    return $this->travel;
}
}

TravelEntity

class Travel
{
/....

/**
 * @ORM\OneToMany(targetEntity="Project\TravelBundle\Entity\Favorite", mappedBy="travel", cascade={"remove"})
 */
private $favorites; 


public function __construct()
{
    $this->favorites = new \Doctrine\Common\Collections\ArrayCollection();
}

/...........
/**
 * Add favorites
 *
 * @param \Project\TravelBundle\Entity\Favorite $favorites
 * @return Travel
 */
public function addFavorite(\Project\TravelBundle\Entity\Favorite $favorites)
{
    $this->favorites[] = $favorites;
    $favorites->setTravel($this);
    return $this;
}

/**
 * Remove favorites
 *
 * @param \Project\TravelBundle\Entity\Favorite $favorites
 */
public function removeFavorite(\Project\TravelBundle\Entity\Favorite $favorites)
{
    $this->favorites->removeElement($favorites);
}

/**
 * Get favorites
 *
 * @return \Doctrine\Common\Collections\Collection 
 */
public function getFavorites()
{
    return $this->favorites;
}

展示你的“收藏”实体,请。 - Ziumin
我已经更新了我的问题,现在你可以看到实体了。 - hous
我建议您从TravelEntity中删除$favorites的OneToMany关系。这样的关系可能会消耗大量资源。 - Ziumin
1个回答

1
好的,你可以尝试这个:
在你的控制器中:
if($user) {
    $favorite = $em->getRepository('ProjectTravelBundle:Favorite')->getFavoriteByUser($user);
    $ids = array_map(function($entity) { return $entity->getTravel()->getId(); }, $favorite);
} else{
    $favorite = '';
    $ids = array();
}
...
return $this->render('ProjectFrontendBundle:Travel:travel-list-view.html.twig',array(
        'ids' => $ids,
        'pagination' => $pagination,
        'nb' => $nb,
        'favorite' =>$favorite, // list of favorites of current user 
    ));

在你的模板中:
{% if travel.id not in ids %}
    <span><a href="{{ path('frontend_travel_add_favorite', {'id': travel.id} ) }}" class="pull-right button btn-small red">Add to favorite</a></span>
{% else %}
    <span><a href="{{ path('frontend_travel_delete_favorite', {'id': favorite.id} ) }}" class="pull-right button btn-small red">Remove from</a></span>
{% endif %}

希望对您有所帮助。

是的,它应该可以工作,但如果你用 $favorite->map(function($entity) { return $entity->getTravel()->getId(); })->toArray(); 替换 $favorite->map(function($entity) { return $entity->getId(); })->toArray();。这就是为什么我问实体代码的原因。 - Ziumin
@Ziumin 谢谢你的提示,我已经更新了答案。希望现在可以正常工作了。 - acontell
1
@hous请检查一下现在是否可行,正如Ziumin所说,没有实体信息就无法知道如何访问正确的数据。 - acontell
我遇到了这个错误:Error: Call to a member function map() on a non-object - hous
@hous 抱歉,getResult() 函数总是返回一个数组。我认为现在它会正常工作了。 - acontell
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接