#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 ничего не возвращается. вот почему вы не получаете ожидаемого результата. я думаю