我有这段代码:
public function taxesData(Product $product)
{
$taxes = \Auth::user()->taxes;
foreach ($taxes as $tax) {
echo "$product->getTax($tax)";
}
}
在测试中给出了这个错误:
类型错误:函数App \ Product :: getTax()的参数太少,在E:\ projects \ ims \ vendor \ laravel \ framework \ src \ Illuminate \ Database \ Eloquent \ Concerns \ HasAttributes.php中传递0 411行和预期的1个
然而,只是一个小小的变化使它有效,但我无法理解。为什么呢?
public function taxesData(Product $product)
{
$taxes = \Auth::user()->taxes;
foreach ($taxes as $tax) {
echo $product->getTax($tax);
}
}
请帮忙。
我试图简化它以便在这里发布...实际上我正在用数据表的html组件创建json - >
public function taxesData(Product $product)
{
$taxes = \Auth::user()->taxes;
return datatables()
->of($taxes)
->addColumn('check',function($tax) use($product){
if($product->hasTax($tax)){
return "<input type='checkbox' class='input-sm row-checkbox' name='tax[$tax->id]' value='$tax->id' checked>";
}else{
return "<input type='checkbox' class='input-sm row-checkbox' name='tax[$tax->id]' value='$tax->id'>";
}
})
->editColumn('tax', function($tax) use($product){
return "<span class='currencyinput form-control'>
<input id='rate' type='text' name='rate' value='$product->getTax($tax)' required autofocus>
</span>"
})
->toJson();
}
添加getTax方法
public function getTax(Tax $t)
{
if($this->hasTax($t)){
return $this->taxes->find($t->id)->pivot->tax;
}
else{
return $t->pivot->tax;
}
}
public function hasTax(Tax $tax)
{
foreach ($this->taxes as $t) {
if($t->id == $tax->id){
return true;
}
}
return false;
}
答案 0 :(得分:4)
它失败了,因为你没有遵循正确的echo字符串语法。
这样可行:
echo "{$product->getTax($tax)}";
实际上,因为你没有&#39;需要引用这样一个简单的表达式:
echo $product->getTax($tax);
答案 1 :(得分:2)
这是我到目前为止所做的。
为简单起见,我创建了一个样本模型。
// SampleModel.php
public function relatedModels()
{
return $this->hasMany(RelatedModel::class);
}
// this is like an accessor, but since our model doesn't have
// a property called `relatedModels`, Laravel will ignore it
// until later...
public function getRelatedModels()
{
return "Sample";
}
鉴于以下代码,这里是输出。
$a = SampleModel::find($id);
$a->relatedModels;
// this returns a collection of related models to this model.
$a->getRelatedModels();
// this returns "Sample";
// HOWEVER, when we try to interpolate that member function call.
"$a->getRelatedModels()"
// this throws error that the method `getRelatedModels` must return a relationship.
// I've also tried to add an argument to my existing function to be in-line with your situation.
public function getRelatedModels($a) ...
// this works well
$a->getRelatedModels(1);
// but this, yes, it throws the error as same as what you've got.
"$a->getRelatedModels(1)";
错误在框架的代码库中指出了这一行。
// HasAttributes.php
protected function getRelationshipFromMethod($method)
{
$relation = $this->$method(); // <-- this line
出于某种原因,执行"$a->getRelatedModels(1)"
会触发模型的__get
魔术方法。
哪个分支到此堆栈调用。
// Model.php
public function __get($key)
{
return $this->getAttribute($key);
}
// |
// V
// HasAttributes.php
public function getAttribute($key)
{
...
return $this->getRelationValue($key);
}
// |
// V
// HasAttributes.php
public function getRelationValue($key)
{
...
if (method_exists($this, $key)) {
return $this->getRelationshipFromMethod($key);
}
}
// |
// V
// HasAttributes.php
protected function getRelationshipFromMethod($method)
{
$relation = $this->$method(); // <-- lastly to this
// $method = "getRelatedModels"
// since our method `getRelatedModels` needs an argument
// this call will fail since it wasn't able to provide an argument.
...
}
这就是为什么你得到过少的参数传递异常。我想进一步调查但我必须回家!
我不知道这是否是Laravel的合法错误,但如果您这么认为,请在Laravel的github存储库中发布。
<强>更新强>
我在github上发布了一个问题,这是对我真正有意义的评论之一。
这既不是Laravel的问题,也不是PHP的问题。您只是使用了错误的语法,请在此处查看:https://github.com/laravel/framework/issues/23639
Github用户 @staudenmeir 评论说:
"$sampleModel->getRelatedModels()"
相当于"$sampleModel->getRelatedModels"."()"
。字符串中变量的使用仅限于
"$foo"
和"$foo->bar"
。像"$foo->bar()"
这样的函数调用 不工作。你可以(但不应该)使用花括号:"{$foo->bar()}"
更好的解决方案就是简单的字符串连接:
"text..." . $sampleModel->getRelatedModels() . "more text..."
这就是为什么要调用魔术方法__get
。