laravel - Получить плитку родительской категории с помощью пользовательской функции модели - PullRequest
0 голосов
/ 12 июня 2019

Я определил родительское отношение в классе категории, используя 'parent_id', как упомянуто ниже, я хочу напечатать заголовок категории с родительским заголовком, например mens > show. но это бросает

Не определено свойство: Осветить \ Database \ Красноречивых \ Отношения \ BelongsTo :: $ титула

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    //
    protected $table = 'categories';


    public function parent()
    {
        return $this->belongsTo('App\Category', 'parent_id');
    }   

    public function withParentTitle(): string
    {               
        if($this->parent()){            
            return $this->parent()->title.' > '. $this->title;
        }
        return $this->title;
    }   


}

CategoryController

................

namespace App\Http\Controllers;

use App\Category;

class CategoryController extends Controller
{

    public function index(){        
        $categories = Category::get();
        foreach($categories as $category){
            echo $category->withParentTitle();
        }
    }
}

Ответы [ 3 ]

1 голос
/ 12 июня 2019

в соответствии с документами Laravel https://laravel.com/docs/5.8/eloquent-mutators

вы можете использовать accessors таким образом

public function getParentTitleAttribute(){
  return $this->parent ? $this->parent->title . '>' . $this->title : $this->title;
}

, затем позвоните $category->parent_title;

0 голосов
/ 12 июня 2019
public function withParentTitle(): string
    {               
        // Your $this->parent() would always be true, 
        // use $this->parent()->exists() instead
        if($this->parent()->exists()){            
            // $this->parent() refers to the relationship, 
            // you can't get title out of the relationship object, 
            // unless you retrieve it using $this->parent
            return $this->parent->title.' > '. $this->title;
        }
        return $this->title;
    }   
0 голосов
/ 12 июня 2019

Вы должны сделать звонок без (), как это:

public function withParentTitle(): string
{               
    if($this->parent()){            
        return $this->parent->title.' > '. $this->title;
    }
    return $this->title;
}

Потому что, если вы используете (), вы вызываете отношение как построитель запросов и можете использовать другие замыкания:

$this->parent()->where('title', 'foo')->first();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...