Merhaba arkadaşlar,
Şöyle bir sorunum var; Elimde 3 adet model var. Page, Tag ve PageTag modelleri ile sayfa işlemlerini ve sayfaya atanan etiketleri yönetiyorum. Tekil olarak herhangi bir sıkıntıları yok ama aralarında bağlantı kurmaya çalıştığımda sanırım sonsuz döngüye giriyor -ki tarayıcı ve pc donuyor-. Normalde tekil olarak bir sayfanın içeriğini çağırdıktan sonra;
$page = Page::where(['guid' => $guid, 'is_deleted' => 0])->first();
// Etiketler hazırlandı
$tag_guids = PageTag::where('page_guid', $page->guid)->select('tag_guid')->get()->toArray();
$tags = Tag::whereIn('guid', $tag_guids)->select('title')->get()->toArray();
$tags_string = '';
foreach ($tags as $tag) {
$tags_string .= $tag['title'] . ', ';
}
$tags_string = rtrim($tags_string, ', ');
$page->tags = $tags_string;
...
..
.
.. ile etiketleri $page objeme ekleyerek işimi hallediyorum ama her defasında bunu yapmam işime gelmiyor. Ayrıca tüm verileri çekerken sıkıntı oluyor. Tüm sayfaları çek, sayfaları döngüye sok, her birine etiketleri sorgulayarak ekle, yeni dizi oluştur ve döndür. Uzun ve gereksiz olmasının yanında performans yönünden uygun değil.
$page = Page::where(['guid' => 'A4A7E792-B909-D81F-F125-7321AD7A652B'])->with_tags()->first();
$pages = Page::with_tags()->get();
Sorguları bunlar gibi yapmak için with_tags() ve tags() fonksiyonlarını yazdım ama işe yaramadı. Tekil ve çoğul veri çekebileceğim şekilde nasıl güncelleyebilirim ?
class Page extends BaseModel
{
protected $table = 'pages';
protected $primaryKey = 'id';
public $timestamps = false;
protected $fillable = [
'parent_page_guid',
'title',
'slug',
'content',
'summary',
'description',
'order',
'status',
'views',
'is_active',
'guid',
'is_deleted',
];
/**
* Üst sayfanın adını verir.
*/
function getParentPageTitle(){
$page = Page::select('title')->where(['guid' => $this->parent_page_guid, 'is_deleted' => 0])->first();
if($page){
return $page->title;
}else{
// Üst sayfası yoksa
if($this->parent_page_guid === '00000000-0000-0000-0000-000000000000'){
return trans('page.parent_page_is_main_page');
}else{
// Üst sayfa herhangi bir sebeple bulunamamışsa
return trans('page.parent_page_not_found');
}
}
}
function tags(){
return $this->hasMany('App\Models\PageTag', 'page_guid', 'tag_guid');
}
function with_tags(){
$tag_guids = PageTag::where('page_guid', $this->guid)->select('tag_guid')->get()->toArray();
$this->tags = Tag::whereIn('guid', $tag_guids)->select('title')->get()->toArray();
}
}
class Tag extends BaseModel
{
protected $table = 'tags';
protected $primaryKey = 'id';
public $timestamps = false;
protected $fillable = [
'title',
'slug',
'guid',
];
}
class PageTag extends BaseModel
{
protected $table = 'page_tags';
protected $primaryKey = 'id';
public $timestamps = false;
protected $fillable = [
'page_guid',
'tag_guid',
'guid',
];
}