亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

由于條件關系而對 null 調用成員函數 addEagerConstraints()

由于條件關系而對 null 調用成員函數 addEagerConstraints()

PHP
慕萊塢森 2024-01-19 15:03:19
我必須處理一個 Laravel 7 應用程序,該應用程序的數據庫設計不理想,導致標題中提到的錯誤。數據庫看起來像這樣:mains- id- sub_typesubs_a- id- main_idsubs_b- id- main_id然后我有一個Main帶有方法的類sub:public function sub(){    switch($this->sub_type) {        case 'a':            return $this->hasOne('SubTypeA');            break;        case 'b':            return $this->hasOne('SubTypeB');            break;        default:            return null;    }}此代碼適用于 99% 的情況,但 Laravel 有時會加載 的空實例Main,然后嘗試加載關系。這是行不通的,因為 method 的默認值sub是null.重組數據庫已列入待辦事項列表,但目前沒有任何幫助。我需要什么選項來阻止 Laravel 嘗試sub在空對象上加載關系?
查看完整描述

3 回答

?
繁星coding

TA貢獻1797條經驗 獲得超4個贊

我知道這是某種預期,但嘗試返回一個空關系?


public function sub()

{

? ? switch($this->sub_type) {

? ? ? ? case 'a':

? ? ? ? ? ? return $this->hasOne('SubTypeA');

? ? ? ? ? ? break;

? ? ? ? case 'b':

? ? ? ? ? ? return $this->hasOne('SubTypeB');

? ? ? ? ? ? break;

? ? ? ? default:

? ? ? ? ? ? return $this->newQuery();? // or newQueryWithoutScopes()

? ? }

}

它應該防止 addEagerConstraints() 對 null 的錯誤。



查看完整回答
反對 回復 2024-01-19
?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

我想指出的幾件事是,您的關系不應該是有條件的,在將默認關系設置為您想要的默認關系之后,您可以定義范圍并管理內容或使用withDefault在失敗情況下返回某些內容。

關于在 null 上調用成員函數的錯誤:- 下面是另一個示例

<?php

class MyClass{

? ? function bar(){

? ? ? ? echo "something";

? ? }

}


class MyAnotherClass{

? ? function foo(){

? ? ? ? if (1>2) {

? ? ? ? ? ? $obj = new MyClass();

? ? ? ? ? ? $obj->x = $x;

? ? ? ? ? ? $obj->y = $y;

? ? ? ? ? ? $obj->save();

? ? ? ? ? ? return $obj;

? ? ? ? } else {

? ? ? ? ? ? return null;

? ? ? ? }

? ? }

}


$myAnotherObj = new MyAnotherClass();

$myClass = $myAnotherObj->foo();

$myClass->bar()

?>

與其這樣做,我更愿意拋出異常并處理它,這樣我就能得到失敗的具體原因,在 Laravel救援輔助函數中你可以選擇使用。


<?php

class MyClass{

? ? function bar(){

? ? ? ? echo "something";

? ? }

}


class MyAnotherClass{

? ? function foo(){

? ? ? ? if (1>2) {

? ? ? ? ? ? $obj = new MyClass();

? ? ? ? ? ? $obj->x = $x;

? ? ? ? ? ? $obj->y = $y;

? ? ? ? ? ? $obj->save();

? ? ? ? ? ? return $obj;

? ? ? ? } else {

? ? ? ? ? ? throw new Exception("could not create my class object", 100); // Better to create custom exception class here

? ? ? ? }

? ? }

}


$myAnotherObj = new MyAnotherClass();

try {

? ? $myClass = $myAnotherObj->foo();

? ? $myClass->bar();

} catch(Exception $e) {

? ? echo $e->getMessage();

}

?>

如果對我來說數據不是那么重要我會考慮創建一個空對象


<?php

? ? class MyClass{

? ? ? ? function bar(){

? ? ? ? ? ? echo "something";

? ? ? ? }

? ? }

? ??

? ? class MyAnotherClass{

? ? ? ? function foo(){

? ? ? ? ? ? $obj = new MyClass();

? ? ? ? ? ? if (1>2) {

? ? ? ? ? ? ? ? $obj->x = $x;

? ? ? ? ? ? ? ? $obj->y = $y;

? ? ? ? ? ? ? ? $obj->save();??

? ? ? ? ? ? }?

? ? ? ? ? ? return $obj;

? ? ? ? }

? ? }

? ??

? ? $myAnotherObj = new MyAnotherClass();

? ? $myClass = $myAnotherObj->foo();

? ? $myClass->bar()

? ?>

但是如果您正在使用該對象屬性進行操作,那么屬性將為 null 而不是對象,因此根據您在使用它時的紀律,您可以做出決定。


我想如何處理你的情況?


異常類


<?php


namespace App\Exceptions;


use Exception;


class SubTypeNotFound extends Exception {

? ? public function report()

? ? {

? ? ? ? \Log::debug('Could not find this subtype');

? ? }

}

?>


模型類


<?php

class Mains extends Model

{

? ? public function subA()

? ? {

? ? ? ? return $this->hasOne(SubTypeA::class);

? ? }? ??


? ? public function subB()

? ? {

? ? ? ? return $this->hasOne(SubTypeB::class);

? ? }


? ? public function scopeSub($query, $type)

? ? {

? ? ? ? return $query

? ? ? ? ? ->when($type === 'a',function($q){

? ? ? ? ? ? ? return $q->with('subA');

? ? ? ? ?})

? ? ? ? ?->when($type === 'b',function($q){

? ? ? ? ? ? ? return $q->with('subB');

? ? ? ? ?}),function($q){

? ? ? ? ? ? ?throw SubTypeNotFound();

? ? ? ? ?});

? ? }

}

?>

檢索它時


try {

? ? $sub = Mains::sub('a')->get();

} catch(SubTypeNotFound $e) {

? ? return $e->getMessage();

}

如果有,$this->sub_type您可以避免使用該type參數。


查看完整回答
反對 回復 2024-01-19
?
慕沐林林

TA貢獻2016條經驗 獲得超9個贊

您可以簡單地將 if 條件放在 switch case 之前。


public function sub()

{

    if($this->sub_type){

        switch($this->sub_type) {

            case 'a':

                return $this->hasOne('SubTypeA');

                break;

            case 'b':

                return $this->hasOne('SubTypeB');

                break;

            default:

                return null;

        }

    }else{

        return null

    }       

}


查看完整回答
反對 回復 2024-01-19
  • 3 回答
  • 0 關注
  • 186 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號