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

Posted

技术标签:

【中文标题】调用未定义的方法 Gallery::newQuery() Laravel【英文标题】:Call to undefined method Gallery::newQuery() Laravel 【发布时间】:2015-08-31 04:12:08 【问题描述】:

我有 3 张桌子

产品

页面

gallery - 两个外键 page_id、product_id

(外键是否应该唯一映射在一起,为什么?)

    <?php

class Gallery extends Eloquent 


    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'gallery';
    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */



    public static $rules = array(
    // 'email'=>'required|email|unique:users',
    // 'password'=>'required|alpha_num|between:6,12|confirmed',
    // 'password_confirmation'=>'required|alpha_num|between:6,12'
    );

    public function pages() 
        return $this->belongsTo('Pages', 'page_id');
    

    public function products() 
         return $this->belongsTo('Products', 'products_id');
    



页面模型

<?php

class Pages extends Eloquent 


    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'pages';

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */

    public static $rules = array(
    'title'=>'required',
    'body'=>'required'
    // 'email'=>'required|email|unique:users',
    // 'password'=>'required|alpha_num|between:6,12|confirmed',
    // 'password_confirmation'=>'required|alpha_num|between:6,12'
    );

    public function gallery() 
             return $this->hasOne('Gallery');
    


产品型号

    <?php

class Products extends Eloquent 


    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'products';
    // public $timestamps = false;
    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */



    public static $rules = array(
        'title'=>'required',
        'body'=>'required'
    // 'email'=>'required|email|unique:users',
    // 'password'=>'required|alpha_num|between:6,12|confirmed',
    // 'password_confirmation'=>'required|alpha_num|between:6,12'
    );

  public function gallery()
    
        return $this->hasOne('Gallery');
    



我在 PagesController 中这样做:

$page = Pages::find($page_id);
$page->gallery throws this error Call to undefined method Gallery::newQuery();
    我使用迁移创建了库表和外键。为什么我必须在模型之间创建关系,这些关系是在数据库中定义的? (菜鸟问题)

2.阅读很多关于可能是什么原因的信息,而不是命名空间。 现在已经坚持了3天,非常感谢任何帮助。 我认为这与我的模特关系有关。

================================更新=============== ==========

好的,所以我做了 $gallery = new Gallery;在我的 PageController 中,这似乎很有效 但现在我得到了这个时髦的错误:

SQLSTATE[23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败(spaggo.gallery,CONSTRAINT gallery_product_id_foreign FOREIGN KEY(product_id)参考products (id) ON DELETE CASCADE ON UPDATE CASCADE) (SQL: insert into gallery (page_id, updated_at, created_at) 值 (6, 2015-06-21 15:24:51, 2015- 06-21 15:24:51))

【问题讨论】:

【参考方案1】:

首先,您的 Laravel 版本是什么?尽管您有假设,但实际上可能是由于命名空间。

其次,作为惯例,我建议您将模型命名为单数,例如 Product 和 Page。

回答您的其他问题:是的,您的数据库可能包含这些关系的约束,但不幸的是 Eloquent ORM 无法使用它们。您仍然需要在模型级别定义这些关系。

【讨论】:

1.我的 laravel 版本是 4.2(运行组合更新 06.16.15,正如 laravel 论坛中类似主题中所建议的那样) 2. 谢谢,我想知道这一点。遵循良好做法很重要! :D 3. 第二个谢谢你,为我解决这个问题,我真的很困惑。如果您需要任何其他说明或代码,以帮助我解决我的问题,请告诉我。寻找错误原因的过程对我来说很重要,它可以帮助我更好地了解框架的工作原理以及将来如何避免上述问题。谢谢。 赞成 Eloquent 解释,真的很困惑为什么我首先需要这些约束。 返回的 Gallery 对象似乎不是 Eloquent 模型的实例。你能做一个var_dump($page-&gt;gallery) 看看你得到了什么吗?您还有其他名为 Gallery 的课程吗?或者只是在您的应用配置中定义的别名?如果是这样,请尝试重命名 Gallery 模型或命名空间。 我无法转储它...返回相同的错误。当我 dd($pages) 时,不应该有关于画廊模型的信息,因为它们有关系吗? 除非您将其指定为急切加载,否则不会。那将是$page = Pages::with('gallery')-&gt;find($page_id); laravel.com/docs/5.1/eloquent-relationships#eager-loading 当你做var_dump(new Gallery()); 时你会得到什么?【参考方案2】:

对于所有 Laravel 模型不应该是 extends Model(当然,除非它是一些旧语法)并且必须通过 use 语句声明该模型:use Illuminate\Database\Eloquent\Model;

我直接知道,如果我忘记将 Model 父类添加到我的模型中,则会出现 Call to undefined method App\SomeClass::newQuery 错误。

【讨论】:

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

调用未定义的方法 BelongsTo::attach()

未调用自定义 UIButton 的 setIsSelected 方法

调用未定义的方法 Cake\ORM\Entity::query() CakePhp

致命错误:未捕获的错误:调用未定义的方法 stdClass::option();

调用类方法时出现“调用未定义函数”错误

调用未定义的方法 Illuminate\Foundation\Application::bindShared()