【问题标题】:accessor not working in laravel 5.5访问器在 laravel 5.5 中不起作用
【发布时间】:2018-01-17 11:13:57
【问题描述】:

我有一个模型,里面有一个访问器

class Test extends Model
{
    protected $fillable = [
        'subject','date',
   ];


    public function getSubjectAttribute($value)
    {
        return ucfirst($value);
    }
}

当我调用模型时,访问器不起作用 我阅读了所有文件和问答,但是... 我在 5.5 中的 Laravel 版本

在模型中我有一个获取数据的方法

public function get_specific_subject($id){
    $subject = DB::table("subjects")
        ->where("id", "=", $id)
        ->first();

    return $subject;
}

我通过下面的代码在我的控制器中调用这个方法

    $subject = new Test();
    $subject = $subject->get_specific_subject($subject_id);
    dd($subject);

dd结果是:

    +"id": 5
    +"subject": "testing subject"
    +"date": "2018-01-17"
    +"created_at": "2018-01-13 15:08:41"
    +"updated_at": "2018-01-13 15:08:41"

【问题讨论】:

  • $subject_id 来自哪里?
  • 您期待什么?你能显示dd($subject)的输出吗?
  • 可能是您使用了错误型号的访问器。
  • 您正在倾倒整个模型。你需要 dd() $subject->subject 如果你想要这个属性
  • @LewisJohnson 重要吗?例如它是静态变量。 $subject_id = 1;

标签: php laravel laravel-5.5 accessor


【解决方案1】:

您正在使用 DB 来获取您的记录,而不是在您的控制器中执行此操作:

  $subject= Test::find($subjectId);
  dd($subject);

在你的模型中,添加这一行:

  protected $table = 'subjects';
  public $primaryKey='id';

【讨论】:

  • 没有任何改变!!访问器再次不起作用
  • 没关系。但我试了一下,没有任何改变
  • ok 然后尝试将模型名称 Test 重命名为 Subject ,并将文件名重命名为 Subject.php
  • 这是正确答案。只有在您调用定义它们的模型时,您的访问器才有效。它们不适用于\DB 外观。如果由于某种原因此解决方案不起作用,则应首先正确设置模型。
  • @SaurabhMistry 绝对不是
【解决方案2】:
class Test extends Model
{
   protected $table = 'subjects';
   protected $fillable = [
       'subject','date',
   ];

   public function getSubjectAttribute($value)
   {
       return ucfirst($value);
   }
}

在控制器中

public function view($subjectId){
    $subject = Test::find($subjectId);
    dd($subject->toArray());
}

【讨论】:

  • 没有任何改变!!访问器再次不起作用
  • 这是错误的。他想要的是“科目”表,而不是测试表。
  • 请检查$subjectId中是否存在值
  • 请查看最新代码。这里添加'$subject->toArray()'。因为只有模型转为json或数组后才会调用accessor
  • @kerbholz 这一切都非常令人困惑。 OP 应该重新开始。
【解决方案3】:

请改用$subject->subject

【讨论】:

    【解决方案4】:

    像这样更改您的代码(使用您的模型):

    public function get_specific_subject($id){
        $subject = Subject::where("id", "=", $id)
            ->first();
        return $subject;
    }
    

    【讨论】:

    • 有find()方法,是where('id', ...)->first()的快捷方式。此方法也应该是静态的。然后就没用了,因为他可以在需要的地方使用 Subject::find($id)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多