【问题标题】:Laravel hasOne() Function Using $this when not in object contextLaravel hasOne() 函数在不在对象上下文中时使用 $this
【发布时间】:2022-12-03 05:47:53
【问题描述】:

我有 2 个名为 AdminContent、AdminCategory 的模型。我的 admin_contents 表中有 content_category_id。我的 admin_categories 表中有 category_id 和 category_name。我将 category_id 与外国的 content_category_id 链接起来。 我在管理内容模型中使用 hasOne() 函数。但是当不在对象上下文中时,我收到错误 Using $this ! 我的主要目标是从 admin_categories 表名列中获取 content_category_id 值

迁移

// Admin Categories Migration
Schema::create( 'admin_categories', function(Blueprint $table) {
            $table->bigIncrements('ctgry_id')->unique();
            $table->string('category_name', 50)->unique();
            $table->timestamps();
        });
// Admin Contents Migration
Schema::create('admin_contents', function (Blueprint $table) {
            $table->bigIncrements('cntnt_id')->unique();
            $table->string('content_title');
            $table->text('content_content');
            $table->string('content_slug');

            $table->bigInteger('content_category_id');
            $table->foreign('content_category_id')->references('ctgry_id')->on('admin_categories');
            
            $table->string('content_status');
            $table->string('create_user');
            $table->string('content_tags');
            $table->string('content_excerpt');
            $table->dateTime('posted_at');
            $table->timestamps();
        });

楷模

// AdminContent Model
protected $table = "admin_contents";

    protected $fillable = [
        'content_title', 'content_content',
        'content_category_id', 'content_status', 'create_user','content_tags',
        'content_excerpt',
        'created_at', 'updated_at'
    ];

    protected $guards = [
        'cntnt_id',
    ];

    public function setCategoryName()
    {
        return $this->hasOne(AdminCategory::class);
    }

当我想使用 $this->hasOne(AdminCategory::class) 访问时,出现此错误!

【问题讨论】:

    标签: php laravel oop laravel-8


    【解决方案1】:

    第一:Laravel 中的关系基于标准化模型,使用 'id' 作为 id 的列名。如果您为 firstKey 使用另一个名称,则应将其添加到关系定义中,如 documentation 中所述。我的意思是,你的关系不应该工作,因为 Eloquent 不知道哪些是你的表第一键。

    第二:当你定义一个关系时,你应该从你的模型中调用 id 。那么你如何访问$this->hasOne(AdminCategory::class)? 它应该类似于AdminContent::with('setCategoryName')

    也许从您的控制器中显示一些代码我们可以给您更准确的答复。

    【讨论】:

      【解决方案2】:

      管理内容模型

      namespace AppModelsAdmin;
      
      use IlluminateDatabaseEloquentFactoriesHasFactory;
      use IlluminateDatabaseEloquentModel;
      
      use IlluminateSupportFacadesDB;
      
      class AdminContent extends Model
      {
          use HasFactory;
      
          protected $table = "admin_contents";
      
          protected $primaryKey = 'cntnt_id';
      
          protected $fillable = [
              'content_title', 'content_content',
              'content_category_id', 'content_status', 'create_user','content_tags',
              'content_excerpt',
              'created_at', 'updated_at'
          ];
      
          protected $guards = [
              'cntnt_id',
          ];
      
          public function _all()
          {
              return self::all();
          }
      
          public static function setCategoryName()
          {
              return $this->hasOne(AdminCategory::class, 'content_category_id', 'ctgry_id');
          }
      }
      

      管理类别模型

      namespace AppModelsAdmin;
      
      use IlluminateDatabaseEloquentFactoriesHasFactory;
      use IlluminateDatabaseEloquentModel;
      
      class AdminCategory extends Model
      {
          use HasFactory;
      
          protected $table = 'admin_categories';
      
          protected $primaryKey = 'ctgry_id';
      
          protected $fillable = [
              'category_name', 'updated_at'
          ];
      
          protected $quards = [
              'ctgry_id', 'created_at'
          ];
      
          public function getAllCategoryName()
          {
              return self::all('ctgry_id','category_name');
          }
      
      }
      

      后控制器

      namespace AppHttpControllers;
      
      use IlluminateHttpRequest;
      
      use AppModelsAdminAdminContent;
      
      class PostController extends Controller
      {
          public function index()
          {
              return view('frontend.blog');
          }
      
          public function getCategoryName()
          {
              return AdminContent::find(1)->setCategoryName;
          }
      }
      

      MySQL 表

      https://www.hizliresim.com/2z0337a

      【讨论】:

        猜你喜欢
        • 2013-12-14
        • 1970-01-01
        • 1970-01-01
        • 2017-04-17
        • 1970-01-01
        • 2015-02-12
        • 2012-12-18
        • 2023-03-22
        • 1970-01-01
        相关资源
        最近更新 更多