<?php
namespace App\Entity;
use CoreDB\Kernel\Model;
use CoreDB\Kernel\Database\DataType\ShortText;
/**
* Object relation with table tag
* @author mbakiyucel
*/
class Tag extends Model
{
/**
* @var ShortText $name
* Etiket adı.
*/
public ShortText $name;
/**
* @inheritdoc
*/
public static function getTableName(): string
{
return "tag";
}
}
Tag sınıfının varlık tanımını entity_config.yml dosyasında yapıyoruz. Varlık tanımı için buraya bakabilirsiniz.
tag:
class: App\Entity\Tag
Blog sınıfı ve Tag sınıfı N-N ilişkili olacağı için bir bağlantı tablosu yapmamız gerekiyor. Tablolar ekranına gidip blogs_tags isminde bir bağlantı tablosu oluşturuyoruz. blogs_tags tablosu bir bağlantı tablosu olacağı için bu tabloyu sınıfa aktarmamıza ihtiyaç bulunmuyor. Ancak gerekli durumlarda aktarılabilir.Sonrasında entity_config.yml dosyasında Blog sınıfı ve Tag sınıfı arasındaki N-N bağlantının bu tablo üzerinden olacağını tanımlıyoruz. Bağlantı çeşitleri için buraya bakabilirsiniz. Blog varlık tanımını aşağıdaki gibi değiştiriyoruz:
blog:
class: App\Entity\Blog
manyToMany:
tag:
mergeTable: blogs_tags
selfKey: blog
foreignKey: tag
createIfNotExist: true
Yapılan bağlantı tanımı Blog nesnesi üzerinde $tag isminde ve CoreDB\Kernel\EntityReference sınıfında bir veri tipi oluşturacaktır. Bu veri tipinin tanımı yapılarak form üzerinde etiket girdisinin konumu ayarlanabilir. Bu girdinin Gövde girdisi altında olması için şu şekilde yerleştirelim:
<?php
namespace App\Entity;
use App\Controller\Admin\BlogController;
use CoreDB\Kernel\Model;
use CoreDB\Kernel\Database\DataType\ShortText;
use CoreDB\Kernel\Database\DataType\LongText;
use CoreDB\Kernel\Database\DataType\Checkbox;
use CoreDB\Kernel\Database\SelectQueryPreparerAbstract;
use CoreDB\Kernel\EntityReference;
use Src\Entity\Translation;
use Src\Views\Link;
use Src\Views\TextElement;
/**
* Object relation with table blog
* @author mbakiyucel
*/
class Blog extends Model
{
/**
* @var ShortText $title
* Blog başlığı
*/
public ShortText $title;
/**
* @var LongText $body
* Blog içeriğinin HTML'i
*/
public LongText $body;
public EntityReference $tag;
/**
* @var Checkbox $published
* Blog yayında mı?
*/
public Checkbox $published;
/**
* @inheritdoc
*/
public static function getTableName(): string
{
return "blog";
}
public function getResultHeaders(bool $translateLabel = true): array
{
$headers = parent::getResultHeaders($translateLabel);
unset($headers["body"]);
return $headers;
}
public function getResultQuery(): SelectQueryPreparerAbstract
{
return \CoreDB::database()->select(self::getTableName(), "b")
->select("b", [
"ID as edit_actions", // edit_actions düzenleme ve silme butonları için gereklidir.
"ID",
"title",
"published",
"created_at",
"last_updated"
]);
}
public function actions(): array
{
return [
Link::create(
BlogController::getUrl() . "add",
TextElement::create(
"<span class='fa fa-plus'></span> " .
Translation::getTranslation("add_new_entity", [
Translation::getTranslation("blog")
])
)->setIsRaw(true)
)->addClass("btn btn-sm btn-primary")
];
}
public function editUrl($value = null)
{
return BlogController::getUrl() . ($value ?: $this->ID);
}
}
public EntityReference $tag;
kısmının konumu bu girdinin konumunu belirleyen etmendir. Belirtilmediği takdirde formun en sonuna yerleşir.
En son durumda formun görünümü aşağıdaki gibi olacaktır:
Tag yazısının düzgün görünmesi için çeviri eklenebilir.
Blogları yönet ekranına gittiğimizde etiket aramasınında bu kısma eklendiğini görebilliriz. Ancak bu N-N bağlantılarda arama kısmının doğru çalışabilmesi için getResultQuery()
metodunda ilgili tablonun sorguya eklenmiş olması gerekmektedir.
Bu yüzden bu metodu şu şekilde değiştiriyoruz:
public function getResultQuery(): SelectQueryPreparerAbstract
{
return \CoreDB::database()->select(self::getTableName(), "b")
->leftjoin("blogs_tags", "bt", "bt.blog = b.ID")
->leftjoin(Tag::getTableName(), "tag", "tag.ID = bt.tag")
->select("b", [
"ID as edit_actions", // edit_actions düzenleme ve silme butonları için gereklidir.
"ID",
"title",
"published",
"created_at",
"last_updated"
])->groupBy("b.ID");
}
Sonrasında arama kısmının da doğru çalıştığını görebiliriz.