在我的项目中,我正在处理多态关系,我觉得很难理解。请记住,我是编程的初学者。我的数据库看起来像这样:
Themes
id - integer
composer_package - string
name - string
Plugins
id - integer
composer_package - string
name - string
Products
id - integer
name - string
...
productable_id - integer
productable_type - string
在下面的商店方法中。我正在获取所选主题的ID。然后我通过$theme = Product::find($selectedTheme);
找到了这个主题。 $ selectedTheme是主题的ID。我有一个名为predefinedArray
的数组,其中包含theme
的所有可填写字段。然后,它将特定主题的所有值放在名为chosen_theme的会话中。
public function store(Request $request)
{
$selectedTheme = null;
foreach($request->input('theme') as $key => $value) {
if($value === 'selected') {
$selectedTheme = $key;
}
}
$theme = Product::find($selectedTheme);
foreach($this->predefinedArray as $value) {
$request->session()->put('chosen_theme.' . $value, $theme->$value);
}
$data = $request->session()->all();
return redirect('plugins');
}
主题是一种产品。我需要获取与之关联的composer_package并将其放入请求中。比方说,我找到一个ID为20的主题,这个主题的productable_id是5.然后我需要在主题表中获取ID为5的composer_package并将其放入请求中。我怎样才能做到这一点?该阵列目前看起来像这样:
如您所见,composer_package字段为空,需要使用与所选产品关联的composer_package填充。
我的模特看起来像这样:
产品
public function productable()
{
return $this->morphTo();
}
public function order_items()
{
return $this->hasMany(Orderitems::class);
}
主题
public function webshops()
{
return $this->hasMany(Webshop::class);
}
public function products()
{
return $this->morphMany(Product::class, 'productable');
}
我怎样才能做到这一点?提前谢谢!
答案 0 :(得分:2)
当你这样做时
$theme = Product::find($selectedTheme);
您正在加载product
表中的数据。但是,composer_package
字段未存储在product
表中,而是存储在theme
/ plugin
表的变形行中。
要访问该值,您需要执行$theme->productable->composer_package
快速而肮脏的方式可能就是这样:
foreach($this->predefinedArray as $value) {
$request->session()->put('chosen_theme.' . $value, $theme->$value);
}
$request->session()->put('chosen_theme.composer_package', $theme->productable->composer_package);