为什么通过__construct()继承的model无法调用all()?

1. 运行环境

Laravel版本:10.10
PHP 版本:8.2
系统:Windows 11

2. 问题描述?

我创建了一个Model

# Message.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class Message extends Model
{
    use HasFactory;

    public $timestamps=false;

    function subject():HasMany
    {
        return $this->hasMany(Subject::class);
    }
}

然后创建了一个repository:

# MessageRepository.php

<?php

namespace App\Repositories;

use App\Models\Message;

class MessageRepository
{
    public function __construct(protected Message $Message)
    {
    }

}

然后创建了一个Message的Service

# MessageService.php

<?php

namespace App\Services;

use App\Repositories\MessageRepository;

class MessageService
{

    function __construct(protected MessageRepository $message)
    {

    }

    function infos()
    {
        return ['count'=>$this->all()->count()];
//        return ['count'=>4];
    }

    function all()
    {
        return $this->message->all();

    }
}

当我试着调用infos函数的时候,laravel报错 Call to undefined method App\Repositories\MessageRepository::all()

当然我可以自己在MessageRepository.php写一个 all(),

# ...略过代码

    function all()
    {
        return $this->message->all();
    }

但是为什么我没能继承model?我尝试在repository里打印$this->message,得到的是message的model啊?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

你调用错了。正确的

function all()
    {
        return $this->message->Message->all();

    }

MessageRepository里的message需要设置为public

MessageRepository没有继承model

1年前 评论
Eroko (楼主) 1年前
讨论数量: 3
  1. 报错提示的是 Call to undefined method App\Repositories\MessageRepository::all()MessageRepository 里没有定义这个方法,所以报错了。
  2. 如果你想要 $this->message 是 Message Model的实例的话,你应该在 MessageRepository 中定义类变量并给变量赋值:$this->message = $message,但是并没有看到你赋值的操作呢?
1年前 评论

你调用错了。正确的

function all()
    {
        return $this->message->Message->all();

    }

MessageRepository里的message需要设置为public

MessageRepository没有继承model

1年前 评论
Eroko (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!