28/10/2016 - DOCTRINE, SYMFONY
Bazen veritabanından birden fazla kayıt seçip yapmak istediğinizi yaparsınız. Bu tarz işler genelde "topluca" yapılan işlemler için geçerlidir, o nedenle verileri tutan değişken içinde birden fazla iri sayılabilecek kayıtlar tutulacaktır ki, bu iyi bir şey değildir. Ayrıca sorgunuz da yavaş çalışacaktır çünkü, seçtiğiniz kayılar tam bir objedir ve bunlarında bağlı olduğu diğer objeler olabilir. Kısacası sonuçta performans düşecektir. Bu tarz problemleri çözmek için objeler yerine sadece kayıtların IDlerini seçip, Reference Proxies kullanarak asıl objelere ulaşabilirsiniz. Aşağıdaki örnek işte tam bu işi yapar.
class UserRepository extends EntityRepository
{
public function findManyByPostcodes(array $postcodes)
{
$q = $this->createQueryBuilder('u')
->where('u.postcode IN (:postcodes)')
->setParameter('postcodes', array_values($postcodes));
return $q->getQuery()->getResult(Query::HYDRATE_SIMPLEOBJECT);
}
}
# Request
findManyByPostcodes(['AB1 BA1', 'UB3 3BU'])
# Response
array(
0 => 15,
1 => 19,
2 => 22,
3 => 45
}
class UserService
{
public function doSomething()
{
$users = $this->userRepository->findManyByPostcodes(['AB1 BA1', 'UB3 3BU']);
foreach ($users as $id) {
$user = $this->getUserReference($id);
// .. Persist, Flush, Remove etc
}
}
private function getUserReference($id)
{
return $this->entityManager->getReference('My\TestBundle\Entity\User', $id);
}
}