【问题标题】:laravel load scope after model created创建模型后的 laravel 加载范围
【发布时间】:2019-07-17 23:57:28
【问题描述】:

我在RoadOffer 模型中有这种类型的范围:

public function scopeOfOfferRelationships($query){
    return $query->with(["priceNegotiations", "driver.user", "roadTransport", "serviceProvider", "serviceProvider.company"]);
} 

然后在我的代码中某处我有这样的代码:

$offer = Offer::where('id', $request->offer_id)->first();
$offer->status = 1;
$offer->save();
return $offer->query()->OfOfferRelationships()->where('id', $request->offer_id)->first();

我必须写 $offer->query()->OfOfferRelationships()->where('id', $request->offer_id)->first(); 才能从范围加载关系。有没有比使用query()更好的方法?
如果我使用load() 函数,我可以加载这些关系,但我想拥有这个scopeOfOfferRelationships,这是唯一的方法吗?

【问题讨论】:

  • 一开始检索报价时为什么不使用范围? Offer::OfOfferRelationships()->where('id', $request->offer_id)->first();
  • 每个查询请求都需要这些吗?如果是这样,您可以将它们添加到模型中的 $with 变量中。这样,您将始终在没有范围的情况下加载这些关系。按范围加载关系并不是一个很好的实践。
  • 如果我要更改 "priceNegotiations", "driver.user", "roadTransport", "serviceProvider", "serviceProvider.company" 内部的内容怎么办?首先检索范围将不起作用。
  • 什么意思?更改某些数组项或更改列出的模型之一?在任何情况下,您都可以简单地将所需的关系存储在一个数组中,并在需要时加载/查询它。毕竟我似乎没有得到这个问题。

标签: php laravel eloquent relationship


【解决方案1】:

每当创建新记录时加载关系

我认为观察者是实现这一目标的最佳方法。

首先创建一个观察者 Offer 模型。

php artisan make:observer OfferObserver

然后在AppServiceProvider注册OfferObserver

Offer::observe(OfferObserver::class)

created() 方法中加载offer 关系。此方法将在您创建新记录时触发。此外,如果您想在更新模型后加载关系,请将以下代码复制并粘贴到 updated() 方法中

 /**
 * Handle the offer "created" event.
 *
 * @param Offer $offer
 * @return void
 */
public function created(Offer $offer)
{
    $offer->load([
       "priceNegotiations", 
       "driver.user", 
       "roadTransport", 
       "serviceProvider", 
       "serviceProvider.company"
    ]);

}

仅在需要时加载关系

在提供模型中创建加载关系的方法。

public function loadRelations()
{
   $this->load([
       "priceNegotiations", 
       "driver.user", 
       "roadTransport", 
       "serviceProvider", 
       "serviceProvider.company"
   ]);
}

然后在需要时使用loadRelations() 方法加载关系

// update process
$offer->save();
$offer->loadRelations()
return $offer;

【讨论】:

  • 如果我这样做,那么如果有时我不想提供与它建立所有这些关系怎么办?我有->OfOfferRelationships(),因为我想提供有时有这些关系,有时没有。
猜你喜欢
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 2018-05-31
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
相关资源
最近更新 更多