为什么通过__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啊?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

你调用错了。正确的

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年前

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