我缺少一些基本的理解/理论,我不理解这些函数调用之间的区别:
$distributors = $store->distributors();
$distributors = $store->distributors;
$distributors = $store->distributors()->get();
$distributors = $store->distributors->get();
我在这里想要做到的是获取一家商店的分销商列表(多对多关系),并且他们将每个啤酒分销商列表都整合到一个巨型列表中。
foreach ($distributors as $distributor)
{
$available_beers = array_merge($distributor->beers(), $available_beers);
}
我不知道这是否是执行此操作的最佳方法,但我无法使其正常工作。与第一批方法类似,我不知道是否需要->$beers
或->$beers()
更新资料
感谢所有回答!这将是我前进的良好参考。我最大的教训是取回集合与取回查询构建器/关系对象之间的区别。为了将来向发现此问题的人员提供参考,以下是我在控制器中设置的内容:
$store = $this->store->find($id)->first();
$distributors = $store->distributors;
$beers = [];
foreach ($distributors as $distributor){
$beers = array_merge($distributor->beers->lists('name', 'id'), $beers);
}
$model->relation()
返回 关系对象
$model->relation
返回关系的 结果
$model->relation()
可以解释得很简单。您正在调用定义关系的实际函数。您的for distributor
可能看起来像这样:
public function distributors(){
return $this->hasMany('Distributor');
}
因此,在调用时,$store->distributors()
您仅获得其返回值$this->hasMany('Distributor')
是的一个实例Illuminate\Database\Eloquent\Relations\HasMany
什么时候使用?
如果要在运行查询之前进一步指定查询,通常会调用关系函数。例如,添加一个where语句:
$distributors = $store->distributors()->where('priority', '>', 4)->get();
当然,您也可以这样做:$store->distributors()->get()
但这与的结果相同$store->distributors
。
这使我对 动态关系属性 进行了解释。
Laravel在幕后做了一些事情,使您可以直接访问关系的结果作为属性。像:$model->relation
。
这是发生在 Illuminate\Database\Eloquent\Model
1) 这些属性实际上不存在。因此,如果您访问$store->distributors
该电话,它将被代理到__get()
2) 然后此方法getAttribute
使用属性名称进行调用getAttribute('distributors')
public function __get($key)
{
return $this->getAttribute($key);
}
3)
在getAttribute
其中检查该关系是否已经加载(存在于中relations
)。如果不存在并且存在关系方法,它将加载关系(getRelationshipFromMethod
)
public function getAttribute($key)
{
// code omitted for brevity
if (array_key_exists($key, $this->relations))
{
return $this->relations[$key];
}
$camelKey = camel_case($key);
if (method_exists($this, $camelKey))
{
return $this->getRelationshipFromMethod($key, $camelKey);
}
}
4) 最后,Laravel调用getResults()
该关系,然后在get()
查询生成器实例上产生a
。(结果与相同$model->relation()->get()
。
问题内容: 以下Spring Framework类之间的主要区别是什么? 使用我们可以访问文件中的值,但也可以做同样的事情。我不理解这些类之间的区别。 问题答案: 是一个接口,而是一个类。 只是一个和一个视图对象的容器。它允许控制器将两个都作为单个值返回。
以下Spring Framework类之间的主要区别是什么? null
问题内容: 据我了解,ng-model可以为分配模型的那个特定元素设置值。鉴于ng值与ng-model有何不同? 问题答案: 它与ng-model结合使用;对于radios和selects,是选择该项目时设置为ng- model的值。用它替代元素的“值”属性,该属性将始终将字符串值存储到关联的ng-model。 在单选按钮的上下文中,它允许您使用非字符串值。例如,如果您有单选按钮“是”和“否”(或
我从Spring开始学习MVC。我听说过很多次< code>Bean,它包含setter和getter。< code>Model基本上就是数据流,而< code>Pojo与< code>Bean相同。但是这个学期我真的很困惑,所有这些对我来说看起来都一样,你能解释一下它们之间的确切区别吗? JAVABEAN 波乔 型
问题内容: 目前,我正在学习AngularJS和我难以理解的区别和。 谁能告诉我它们的区别以及何时应使用另一种? 问题答案: ng-bind 具有单向数据绑定($ scope->视图)。它有一个快捷方式 ,用于显示插入到html中的范围值,其中是变量名。 ng-model 用于放置在表单元素中,并具有双向数据绑定($ scope-> view and view-> $ scope),例如。
问题内容: 以下调用之间有区别吗? 与 应该首选哪一个? 问题答案: 这两个函数以截然不同的方式处理段。只会将它与前一个参数连接起来,但是会将其视为根目录,并忽略所有先前的路径- 将其视为与每个参数一起执行的结果: 要注意的另一件事是,它将始终产生绝对URL,并且将使用您的工作目录作为解析此路径的基础。但是,无论如何,这都是一条绝对路径,这对您而言并不重要。 对于您应该使用哪一个,答案是:这取决于