Laravel - 获得与产品相关的价值

时间:2018-03-20 10:00:07

标签: php laravel laravel-5 relationship

在我的项目中,我正在处理多态关系,我觉得很难理解。请记住,我是编程的初学者。我的数据库看起来像这样:

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并将其放入请求中。我怎样才能做到这一点?该阵列目前看起来像这样:

enter image description here

如您所见,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');
}

我怎样才能做到这一点?提前谢谢!

1 个答案:

答案 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);