【问题标题】:Laravel - ORM - call to undefined methodLaravel - ORM - 调用未定义的方法
【发布时间】: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:)

标签: php orm laravel


【解决方案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)发生冲突

【讨论】:

    猜你喜欢
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 2016-06-05
    • 2016-09-03
    • 2015-06-10
    • 2016-12-16
    • 1970-01-01
    相关资源
    最近更新 更多