Yukarıdaki cevaplar neler olup bittiğini anlamam için yeterli değildi, bu yüzden biraz daha derinlemesine inceledikten sonra, anlamaya çalıştığım gibi mücadele eden insanlar için mantıklı olacak bir açıklama yolum olduğunu düşünüyorum.
inversedBy ve mappedBy, INTERNAL DOCTRINE motoru tarafından ihtiyaç duyduğunuz bilgileri almak için yapması gereken SQL sorgularının sayısını azaltmak için kullanılır . İnversedBy veya mappedBy eklemezseniz açık olmak gerekirse, kodunuz yine de çalışır ancak optimize edilmeyecektir .
Örneğin, aşağıdaki sınıflara bakın:
class Task
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="task", type="string", length=255)
*/
private $task;
/**
* @var \DateTime
*
* @ORM\Column(name="dueDate", type="datetime")
*/
private $dueDate;
/**
* @ORM\ManyToOne(targetEntity="Category", inversedBy="tasks", cascade={"persist"})
* @ORM\JoinColumn(name="category_id", referencedColumnName="id")
*/
protected $category;
}
class Category
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
/**
* @ORM\OneToMany(targetEntity="Task", mappedBy="category")
*/
protected $tasks;
}
Bu sınıflar, şemayı oluşturmak için komutu çalıştırırsanız (örneğin bin/console doctrine:schema:update --force --dump-sql
), Kategori tablosunda görevler için bir sütun olmadığını fark edeceksiniz. (bunun nedeni, üzerinde sütun ek açıklaması olmamasıdır)
Burada anlaşılması gereken önemli şey, değişken görevlerin yalnızca orada olmasıdır, böylece dahili doktrin motoru, üstündeki mappedBy Category yazan referansı kullanabilir. Şimdi ... burada benim gibi karıştırmayın ... Kategori, SINIF ADINA atıfta bulunmuyor, Görev sınıfındaki 'korumalı $ kategori' adlı özelliğe atıfta bulunuyor.
Bilge gibi, Görevler sınıfında $ category özelliği bunun tersBy = "görevler" olduğundan bahseder, bunun çoğul olduğuna dikkat edin, bu SINIF ADININ ÇOĞULU DEĞİLDİR , ancak özelliğin Kategori içinde 'korumalı $ görevler' olarak adlandırılması nedeniyle sınıf.
Bunu anladıktan sonra, inversedBy ve mappedBy'nin ne yaptığını ve bu durumda nasıl kullanılacağını anlamak çok kolay hale gelir.
Örneğimdeki 'görevler' gibi yabancı anahtara başvuran taraf her zaman inversedBy özniteliğini alır çünkü o sınıfta hangi sınıfın (targetEntity komutu aracılığıyla) ve hangi değişkenin (inversedBy =) 'geriye doğru çalışacağını' bilmesi gerekir. konuşun ve kategori bilgilerini alın. Bunu hatırlamanın kolay bir yolu, foreignkey_id'ye sahip olan sınıf, inversedBy'ye sahip olması gereken sınıftır.
Kategori ve onun $ tasks özelliği (tabloda olmayan, optimizasyon amaçları için sınıfın sadece bir kısmı hatırlayın) MappedBy 'görevler' olduğunda, bu iki varlık arasındaki ilişkiyi resmi olarak oluşturur, böylece doktrin artık güvenle iki ayrı SELECT deyimi yerine JOIN SQL deyimleri kullanın. MappedBy olmadan, doktrin motoru JOIN ifadesinden bilemez, kategori bilgisini yerleştirmek için 'Görev' sınıfında hangi değişkeni yaratır.
Umarım bu biraz daha iyi açıklar.