Laravel 4中的多态关系 - morphOne()

时间:2013-08-19 13:06:16

标签: php polymorphism laravel laravel-4 eloquent

我在两个模型之间创建多态关系时遇到了麻烦:

  • 上传

群组模型的简化版本:

use Cartalyst\Sentry\Groups\Eloquent\Group as SentryGroupModel;

class Group extends SentryGroupModel {

  ...

  /**
   * returns the logo (upload model) from this agency
   *
   * @return Upload
   */
  public function logo()
  {
      return $this->morphOne('Upload', 'uploadable', 'model_type', 'model_id');
  }  

  ...

}

上传模型的简化版

class Upload extends Eloquent {

  ...

  /**
   * returns the polymorphic relationship
   *
   * @return Upload
   */
  public function uploadable()
  {
      return $this->morphTo('uploadable', 'model_type', 'model_id');
  }  

  ...

}

正如您所看到的, Group 模型实际上是扩展的Sentry 2 Group模型,它是一个扩展的Eloquent模型。

在控制器中调用关系时:

$agencyGroup->logo->saveUpload('logo');

我收到PHP错误:

  

在非对象上调用成员函数saveUpload()

对此有何帮助?

1 个答案:

答案 0 :(得分:2)

函数logo()返回MorphOne关系,由于没有定义为saveUpload MorphOne的方法,因此会将调用重定向到其Builder,它也没有这个方法,并抛出你遇到的第二个例外:

  

调用未定义的方法Illuminate \ Database \ Query \ Builder :: saveUpload()

这种行为是预期的,这是Eloquent的工作方式。这就是为什么你应该首先使用logo 而不是 ()

虽然您的$agencyGroup可能没有徽标,导致我提到的NULL->saveUpload()并抛出第一个例外:

  

在非对象

上调用成员函数saveUpload()

尝试在控制器上添加:

if (empty($agencyGroup->logo)) {
    var_dump("There's no logo.");
    die();
}

$agencyGroup->logo->saveUpload('logo');

如果您看到“没有徽标”的消息,则表示您在调用saveUpload方法之前应先创建一个徽标。