我在两个模型之间创建多态关系时遇到了麻烦:
群组模型的简化版本:
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()
对此有何帮助?
答案 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
方法之前应先创建一个徽标。