【问题标题】:Laravel find() does not get data from the DBLaravel find() 没有从数据库中获取数据
【发布时间】:2021-08-31 16:09:13
【问题描述】:

我有一个资源控制器,使用这种index 方法,如下所示:

public function index()
{
        $args = [];
        $args = array_merge($args, $this->data_creator(35, 12, 'book'));
        $args = array_merge($args, $this->data_creator(37, 12, 'kit'));
        $args = array_merge($args, $this->data_creator(38, 12, 'game'));

        $args['menu_links'] = [
            'books'     => route('shopping-products.category', Category::find(25)->slug),
            'videos'    => route('shopping-products.category', Category::find(24)->slug),
            'kits'      => route('shopping-products.category', Category::find(23)->slug),
            'games'     => route('shopping-products.category', Category::find(22)->slug),
        ];
    
        return view('frontend.shop.products.index', $args);
}

但它返回此错误:

试图获取非对象的属性“slug”

当我 dd(Category::find(25), Category::find(24), Category::find(23), Category::find(22)); 我得到 NULL 结果。

表示找不到指定id的数据。

但是categories 表中存储了 25 条记录:

那么这里出了什么问题?我该如何解决这个问题?

非常感谢你们的任何想法或建议......

提前致谢。

这里是Category.php模特:

class Category extends Model
{
    use Sluggable, SoftDeletes;

    protected $table = 'categories';
    protected $primaryKey = 'cat_id';
    protected $guarded = [];

    /**
     * Return the sluggable configuration array for this model.
     *
     * @return array
     */
    public function sluggable()
    {
        return [
            'slug' => [
                'source' => 'cat_name'
            ]
        ];
    }

    public function path()
    {
        return "/products/categories/$this->slug";
    }

    public function children()
    {
        return $this->hasMany(Category::class, 'cat_parent_id', 'cat_id');
    }

    public function parents()
    {
        return $this->hasMany(Category::class, 'cat_id', 'cat_parent_id');
    }

    public function products()
    {
        return $this->belongsToMany(Product::class, 'category_products', 'ctp_cat_id', 'ctp_prd_id');
    }

    public function news()
    {
        return $this->belongsToMany(News::class, 'category_news', 'ctn_cat_id', 'ctn_nws_id');
    }

    public function galleries()
    {
        return $this->belongsToMany(Gallery::class, 'category_galleries', 'ctg_cat_id', 'ctg_gly_id');
    }

    public function uploaded()
    {
        return $this->hasMany(UploadedFile::class, 'upf_object_id', 'cat_id')->where('upf_object_type_id', '=', '107');
    }

    public function articles()
    {
        return $this->belongsToMany(Article::class, 'article_category', 'act_cat_id', 'act_art_id');
    }

    public function olympiadExam()
    {
        return $this->belongsToMany(OlympiadExam::class, 'olympiads_exams_categories', 'oec_ole_id', 'oec_cat_id');
    }

    public function olympiadExamQuestion()
    {
        return $this->belongsToMany(OlympiadExamQuestion::class, 'olympiads_exams_questions_categories', 'oes_cat_id', 'oes_oeq_id')->orderBy('oeq_number', 'asc');
    }

    public function attr_attributes()
    {
        return $this->hasMany(CategoryAttribute::class, 'category_id', 'cat_id');
    } //

    public function attr_product()
    {
        return $this->hasMany(Product::class, 'prd_cat_att_id', 'cat_id');
    } //

    public function couponRelation()
    {
        return $this->hasMany(couponRelation::class, 'object_id', 'cat_id')->where('object_type', 'product_category');
    }

    public function magazines()
    {
        return $this->belongsToMany(Magazine::class, 'category_magazine', 'category_id', 'magazine_id');
    }

}

当我这样做时:dd(Category::where('cat_id', 25), Category::where('cat_id', 24), Category::where('cat_id', 23), Category::where('cat_id', 22)); 我得到这个结果:

【问题讨论】:

  • 您能否提供更多调试信息,包括正在运行的实际查询?运行 Category::where('cat_id', 25)->dd() 会有所帮助。
  • @erikgaal "select * from categories where cat_id = ? and categories.deleted_at is null" array:1 [▼ 0 => 25]
  • Category 是否与php artisan tinker 有相同的行为? $cat = Category::find(10); 显示预期输出?我没有发现明显的错误。也许型号名称Category 不明确?
  • Category::where('cat_id', 25) 只是 Eloquent 查询。您应该致电Category::where('cat_id', 25)->first()->find(25) 进行比较

标签: php laravel eloquent laravel-8 laravel-5.8


【解决方案1】:

根据上述答案:如果您使用的是软删除,则需要添加 Category::withTrashed()

但是,您可以将命令包装在 optional() 辅助函数中。

optional(Category::find(22))->slug

// if you are using soft delete
optional( Category::withTrashed()->find(22) )->slug

如果 22 不存在,这将返回 null 而不是抛出异常错误。

【讨论】:

    【解决方案2】:

    问题是因为您使用的是SoftDeletes,所以软删除的模型将自动从查询结果中排除。在你的情况下,看起来像Category id 22、23、24、25 被软删除。要获得它,您需要使用doc 中提到的withTrashed()。例如:

    Category::withTrashed()->find(22)->slug
    

    【讨论】:

    • 但是 Category::where 有效,它们不应返回已删除的记录
    • @imaginabit OP 只是调用了dd(Category::where('cat_id', 25)),而不是dd(Category::where('cat_id', 25)->first()),所以它实际上并没有返回结果。
    猜你喜欢
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 2011-04-08
    • 2019-08-15
    • 2015-08-11
    • 2015-11-26
    • 1970-01-01
    相关资源
    最近更新 更多