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('.....')-&gt;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 子句匹配的Models,以及相关的Makers,但也只返回与where 子句匹配的那些。

但你需要的可能是这个(根据你的问题):

Model::with('maker')->where('title', 'like', "%$search%") // where on models table
    ->paginate(10);

另一方面,这会返回与where 匹配的Models,每个都有相关的Maker

注意:Model 类的命名空间,因此它不会与 Illuminate\Database\Eloquent\Model(它扩展别名为 Eloquent)发生冲突

【讨论】:

以上是关于Laravel - ORM - 调用未定义的方法的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 调用未定义的方法。方法存在

致命错误:调用未定义的方法 MyModule\Entity\MyEntity::findAll() 学说 orm 2 zf2

Laravel:调用未定义的方法 Illuminate\\Database\\Query\\Builder

Laravel 5:调用未定义的方法 Illuminate\Database\Eloquent\Collection::exists()

调用未定义的方法 App\Models\Car::setCreatedAt() - Laravel - 5.8.16

调用未定义的方法 Gallery::newQuery() Laravel