Проверьте, существует ли столбец в таблице модели Laravel, а затем примените условие

Текущая ситуация: Мы создаем новую базу данных для новой регистрации.

Проблема: Если при миграции базы данных были внесены какие-либо изменения, нам необходимо обработать их для ранее созданной базы данных. Или запустите эту миграцию для каждой ранее созданной базы данных.

Если мы запустим миграцию для каждой базы данных, проблем не возникнет.

Вопрос: как проверить, что в таблице базы данных есть столбец, для которого мы применяем условие в запросе.

В настоящее время мне нужно сначала запустить два запроса для первой строки и проверить существование этого столбца, а затем применить условие в предложении where. как показано ниже

$firstRow = Model::first();
if (isset($firstRow->is_splited)){
    $records = Model::where('is_splited',0)->get(); // this will give error if I don't check column existence for previously created database. 
}else{
    $records = Model::all();
}

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


Спасибо за ваше время и предложение.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
15
0
19 053
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете сделать следующее, чтобы получить массив классов Column:

$columns = $model->getConnection()->getDoctrineSchemaManager()->getColumns();

Также есть getColumnListing и hasColumn.

Ух ты дал идею.

Niklesh Raut 06.08.2018 10:35

Я знаю, что он не полный, но мне очень помог. Теперь я могу использовать in_array('col_name',$columns)

Niklesh Raut 06.08.2018 10:41

@DigitalDrifter Call to undefined method Doctrine\DBAL\Schema\MySQLSchemaManager::getColumns()

DolDurma 09.03.2021 11:55
Ответ принят как подходящий

@DigitalDrifter дал идею использовать класс Schema, поэтому я просто попробовал вот так

Я включаю класс Schema

use Illuminate\Support\Facades\Schema;

И проверьте столбец с помощью класса Schema, и он также работает

$isColExist = Schema::connection("connection_name")->hasColumn('table_name','is_splited');
$q = Acquire::with("block");
if ($isColExist){
    $q->where('is_splited',0);
}
$records = $q->get();

@pankajkumar: Дханбад, я имею в виду Дханьявада :)

Niklesh Raut 27.11.2019 08:28

ха-ха-ха, Дханбад не ошибся .. Я из Дханбад-Джаркханда. Никеш Джи, я хочу к тебе присоединиться. пожалуйста, отправьте свою почту или Wtsup для обмена технологиями. Я работаю над концепцией Multiple Vendor Auth в Laravel. так что я думаю, вы можете мне помочь. Модель уже разработана и используется в проекте. но я хочу улучшить это. так я говорю. отправьте свою почту в [email protected]. @ Никлеш, откуда ты?

pankaj kumar 28.11.2019 09:40

Обновленное решение, работающее в 5.8

if ($object->getConnection()
           ->getSchemaBuilder()
           ->hasColumn($object->getTable(), 'column_name')) {
    // required update here
}

Это решение требует для работы только $ object и 'column_name'. Имена соединений и таблиц являются производными от самого объекта.

Этот сработал для меня, не импортируя ничего.

daraul 05.11.2019 13:34

Поздно, но простое и быстрое решение

    if (Schema::hasColumn('flights', 'departure_time')){
        // do something
      }

Другие вопросы по теме