Laravel - 节省雄辩的关系

Posted

技术标签:

【中文标题】Laravel - 节省雄辩的关系【英文标题】:Laravel - Save on eloquent relationship 【发布时间】:2018-06-20 16:01:45 【问题描述】:

我有 3 个模型 UserStoreMerchantProduct

用户有很多商店 Stores有很多MerchantProduct MerchantProduct 属于用户和商店

我希望能够将user_idstore_id 保存在merchantproduct 表中

用户模型

class User extends BaseModel  
  public function stores()
   
   return $this->hasMany(Store::class);
   
  public function products()
   
   return $this->hasMany(MerchantProduct::class);
   

店铺模式

class Store extends BaseModel  
  public function owner()
   
   return $this->belongsTo(User::class);
  
  public function merchantProducts()
   
   return $this->hasMany(MerchantProduct::class);
  

商家模式

class MerchantProduct extends BaseModel  
  public function owner()
   
   return $this->belongsTo(User::class);
  
  public function store()
   
   return $this->belongsTo(Store::class);
  

我尝试使用下面的代码进行保存,但我收到了呼叫

未定义方法 Illuminate\Database\Query\Builder::merchantProducts() 错误

$request->user()->stores()->merchantProducts()->create($request->all());

这样做的正确/正确方法是什么

【问题讨论】:

dd($request->user()->stores()) 如果结果是一个集合,你可以这样做,否则你必须使用$request->user()->stores->merchantProducts() store_id 不是在功能上决定了 user_id 吗?如果你把它标准化,可能就不那么令人头疼了。 【参考方案1】:

我会采用非常简单的方法。由于您的store 模型已经有一个user_id,那么您可以循环遍历store 集合并保存到DB

($request->user()->stores() as $store)
    $merchant_product = new MerchantProduct();
    $merchant_product->user_id = $store->user_id;
    $merchant_product->store_id = $store->id;
    //your other fields go here as you want to insert to merchant product
    $merchant_product->save();

【讨论】:

【参考方案2】:

首先,您不应该将user_idowner() 关系添加到MerchantProduct 模型中。

但如果您想这样做,请手动添加用户 ID 来保存 MerchantProduct 对象:

Store::merchantProducts()->create(['user_id' => auth()->id()] + $request->all());

另外,将user_id 添加到MerchantProduct 模型中的$fillable 数组中。

【讨论】:

谢谢。我尝试了这种方法,但仍然遇到问题中提到的相同错误。

以上是关于Laravel - 节省雄辩的关系的主要内容,如果未能解决你的问题,请参考以下文章

雄辩的关系,模型的链接(Laravel 5.4)

Laravel - 雄辩的自我关系

Laravel 雄辩的一对一通过(级别/树)关系

Laravel,雄辩的 n:m 关系

laravel 雄辩的关系查询

Laravel 复杂的雄辩关系