использование черт внутри контроллера laravel

#php #laravel #eloquent #vuejs2

#php #laravel #красноречивый #vuejs2

Вопрос:

У меня есть несколько повторяющихся кодов внутри моего контроллера laravel (7.23.0)

 use AppModelA;
use AppModelB;
use AppModelC;
use AppTraitsDbTrait;

    class DarsController extends Controller
    {
       use DbTrait;

    public function A($id) {
           return ModelA::where('column', $id)->get(*);
    }
    public function B($id) {
           return ModelB::where('column', $id)->get(*);
    }

    public function C($id){
           return ModelC::where('column', $id)->get(*);
      }
    //the only difference in these codes is model, all codes are the same
    
  }
  

Я создал папку с именем Traits и внутри нее определил признак DbTrait.php

 <?php 
namespace AppTraits;

trait DbTrait
{
    public function getAllz($ModelName , $id){
        return $ModelName::where('column', $id)->get('*');
    }
}
  

итак, я изменил функции моего контроллера на это

 public function A($id) {
            //   return ModelA::where('column', $id)->get(*); works fine
               $this->getAllz('ModelA', $id);// throws an error

   }
  

выдает сообщение об ошибке: «Класс ‘ModelA’ не найден»

Спасибо

обновление: я должен извиниться, мне очень жаль, 3 ответа сработали, и я вижу данные внутри вкладки network, я использую vue для отображения данных, и я думаю, что использование trait создало сложный массив

это мой простой vue

 axios.get('/api/emla/'   id).then(response =>{
                         this.data = JSON.parse(JSON.stringify(response.data)); 
}
  

Комментарии:

1. потому что он ищет ModelA класс в вашем каталоге черт

2. app( 'App' . $ModelName )::where('column', $id)->get('*');

3. спасибо @swadha могу я попросить вас уточнить, я не мог просто скопировать и вставить ваш код

4. Что вы пытались сделать, чтобы устранить проблему? Почему бы не использовать полное имя класса (включая пространство имен)?

5. @Нико как? извините, я новичок

Ответ №1:

Импортируйте классы, которые будут использоваться в вашем чертеже, как вы это делали в классе контроллера.

 use AppModelA;
use AppModelB;
use AppModelC;
  

Ответ №2:

причина, по которой вы получаете Class 'ModelA' not found , заключается в том, что он ищет этот класс в вашем каталоге черт, который он не найдет. итак, вам нужно это вместо:

 <?php 
namespace AppTraits;

trait DbTrait
{
    public function getAllz($ModelName , $id) {
        return app( "App\" . $ModelName )::where('column', $id)->get('*');
    }
}
  

предполагая, что вы определили свои модели в App пространстве имен

Комментарии:

1. @спасибо свадхва, я вообще не менял каталог моделей (он находится в каталоге по умолчанию), я использую код Visual Studio, я вставил ваш код, он говорит, ожидая «)», я нуб

2. сообщение: «Целевой класс [ App{ModelA}] не существует».

3. @raamiin ах, черт, я забыл избежать обратной косой черты. можете ли вы проверить сейчас. извините.

4. спасибо, но «у этого запроса нет доступных данных ответа»

5. @raamiin это кажется несвязанной проблемой. Я предоставил вам решение. Пожалуйста, примите это и отправьте новый вопрос, и я рассмотрю это. Спасибо.

Ответ №3:

вам необходимо изменить свой признак

ModelName::where он пытается загрузить класс в trait, поэтому используйте $ModelName->where здесь $ModelName уже экземпляр этого класса, чтобы вы могли вызывать функцию через -> operator

 <?php 
namespace AppTraits;

trait DbTrait
{
    public function getAllz($ModelName ,$columnName ,$id){
        return $ModelName->where($columnName, $id)->get('*');
    }
}
  

и для вызова этой функции

 $this->getAllz(new ModelA, $id);
  

таким образом, вам не нужно импортировать класс внутри черты

ваш окончательный код будет выглядеть следующим образом

 
use AppModelA;
use AppModelB;
use AppModelC;
use AppTraitsDbTrait;

class DarsController extends Controller
{
    use DbTrait;

    public function A($id)
    {
        return $this->getAllz(new ModelA,'column', $id);
    }
    public function B($id)
    {
        return $this->getAllz(new ModelB,'column', $id);
    }

    public function C($id)
    {
        return $this->getAllz(new ModelC,'column', $id);
    }
}
  

Комментарии:

1. @спасибо, камлеш, я отредактировал вопрос из-за опечатки, извините за это, я пытался, но он выдает мне сообщение «у этого запроса нет доступных данных ответа»

2. @raamiin что вы пробовали и какую ошибку вы получаете.?

3. все, ваш ответ, он не дал мне данные из базы данных, поэтому я проверяю в Google dev tools на вкладке сеть

4. @raamiin потому что вся модель ищет dars_id столбец, когда вы пишете в коде

5. я тщательно попробовал этот ответ, ошибка изменилась на «Класс ‘ModelA’ не найден»

Ответ №4:

100% должно сработать, если вы будете следовать этому

 public function A($id) {
        //   return ModelA::where('column', $id)->get(*); works fine
           $model = new ModelName(); // new ModelName;
           $this->getAllz($model, $id);// throws an error

}


public function getAllz($ModelName , $id){
    return $ModelName->where('column', $id)->get('*');
}
  

Комментарии:

1. спасибо Ripon, когда я dd( $this-> getAllz($model, $ id)); я вижу данные на вкладке сеть, но я не могу получить то, что хочу

2. из метода A ничего не возвращается. вот почему вы не получаете ожидаемого результата. я думаю