Laravel - ORM - 调用未定义的方法
Posted
技术标签:
【中文标题】Laravel - ORM - 调用未定义的方法【英文标题】:Laravel - ORM - call to undefined method 【发布时间】:2014-05-30 11:21:43 【问题描述】:app/models/Model.php
:
<?php
class Model extends Eloquent
public function maker()
return $this->belongsTo('Maker', 'maker_id', 'id');
?>
我想执行搜索。用户输入模型的名称,搜索应该返回该模型的制造商(每个模型属于某个制造商)。以下代码不起作用:
$result = Model::where('title', 'LIKE', '%test%')->maker()->paginate(10);
它给了我以下错误:
BadMethodCallException
Call to undefined method Illuminate\Database\Query\Builder::maker()
有什么想法吗?
【问题讨论】:
显然“where”方法返回的是Builder类型的对象,而不是Model 嗯。您对如何解决有什么建议吗? 你的模型太抽象了,不是吗?而不是Model
,它应该是具体的表格,例如制作者。 Maker::where('.....')->paginate(10)
请再次阅读问题。用户通过输入模型的标题进行搜索,搜索返回该模型的相应制造商。
应该反过来,先做对象,然后在上面做where
:)
【参考方案1】:
我已经解决了我自己的问题。
$result = Model::where('models.title', 'LIKE', $query)
->leftJoin('makers', 'models.maker_id', '=', 'makers.id')
->orWhere('makers.title', 'LIKE', $query)
->groupBy('makers.title')
->paginate(10);
【讨论】:
为什么重复的'models.title', 'LIKE', $query
?
一个是models.title
,另一个是makers.title
【参考方案2】:
根据您的解决方案:
// $search is the keyword to find
Model::with(['maker' => function ($q) use ($search)
$q->where('title', 'like', "%$search%"); // where on makers table
])->where('title', 'like', "%$search%") // where on models table
->paginate(10);
这将返回与where
子句匹配的Model
s,以及相关的Maker
s,但也只返回与where
子句匹配的那些。
但你需要的可能是这个(根据你的问题):
Model::with('maker')->where('title', 'like', "%$search%") // where on models table
->paginate(10);
另一方面,这会返回与where
匹配的Model
s,每个都有相关的Maker
注意:Model
类的命名空间,因此它不会与 Illuminate\Database\Eloquent\Model
(它扩展别名为 Eloquent)发生冲突
【讨论】:
以上是关于Laravel - ORM - 调用未定义的方法的主要内容,如果未能解决你的问题,请参考以下文章
致命错误:调用未定义的方法 MyModule\Entity\MyEntity::findAll() 学说 orm 2 zf2
Laravel:调用未定义的方法 Illuminate\\Database\\Query\\Builder
Laravel 5:调用未定义的方法 Illuminate\Database\Eloquent\Collection::exists()