ארכיון הקטגוריה: php

תקלת XML – שנקראת Invalid at the top level of the document

אני משתמש ב-MSXML כדי לקבל XML באמצעות VBA, שנשלח מ-PHP .

מסיבה לא ברורה, לפעמים יש סימן שאלה *לפני* התו הראשון.
זה נראה כך :

?

מה שגורם לתקלה "קטנה" ב-XML.

הבעיה : תקלות ב-MSXML לא תמיד מדווחות כתקלות VBA
לכן קשה לדעת שהייתה תקלה כי (Err.number=0)

פתרונות משולבים :
1. כדי לדעת אם הייתה תקלה יש להשתמש ב
xmlOBJECT.parseError.errorCode - עבור הקוד של התקלה
ועבור התיאור ב - reason במקום errorcode.

2. כדי להתמודד עם זה, יש לזהות את הקוד ASCII של התו הראשון, ולנקות אותו.

מדריך Yii 2 – עבודה עם דאטאבייסים

במדריך הזה ניצור עמוד חדש שמציג תוכן של טבלה ב-DB בשם country. כדי לעשות זאת, אנחנו נגדיר את החיבור ל-DB ( כלומר connection), ניצור אוביקט של  Active Record , נגדיר action, וניצור view.

במדריך נעבור על הנושאים הבאים :

  • הגדרת connection אל הדאטאבייס
  • הגדרת אוביקט ActiveRecord
  • איך לבצע שאילתות על אוביקט ActiveRecord
  • איך להציג רשומות , עם חלוקה לעמודים (pagnition)

הנחת היסוד היא שיש לך ידע מסוים בדאטאבייסים, אתה צריך לדעת ליצור DB, להריץ פקודות SQL ולהשתמש באיזשהוא כלי ניהול של DB.

הכנת הדאטאבייס

כדי להתחיל, צור דאטאבייס בשם yii2basic שממנו נמשוך את הנתונים. אתה יכול ליצור אותו ב- SQLite, MySQL, PostgreSQL, MSSQL ,Oracle, לכולם יש תמיכה מובנית ב-Yii.

יחד עם זאת, בשביל הפשטות ההנחה לצורך המדריך הזה היא שאתה משתמש ב-MySql.

שלב שני, הרץ את הפקודות הבאות, שיוצרות טבלה בשם country, ומכניסות לה מספר רשומות.

CREATE TABLE `country` (
  `code` CHAR(2) NOT NULL PRIMARY KEY,
  `name` CHAR(52) NOT NULL,
  `population` INT(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `country` VALUES ('AU','Australia',18886000);
INSERT INTO `country` VALUES ('BR','Brazil',170115000);
INSERT INTO `country` VALUES ('CA','Canada',1147000);
INSERT INTO `country` VALUES ('CN','China',1277558000);
INSERT INTO `country` VALUES ('DE','Germany',82164700);
INSERT INTO `country` VALUES ('FR','France',59225700);
INSERT INTO `country` VALUES ('GB','United Kingdom',59623400);
INSERT INTO `country` VALUES ('IN','India',1013662000);
INSERT INTO `country` VALUES ('RU','Russia',146934000);
INSERT INTO `country` VALUES ('US','United States',278357000);

כעת, יש לך כבר דאטאבייס שנקרא yii2basic ובתוכו לפחות טבלה אחת בשם country עם כמה עמודות ו-10 רשומות.

הגדרת החיבור לדאטאבייס (database connection)

לפני שנמשיך, נא וודא ש-php  מותקנת אצלך עם התוספת שנקראת PDO, זוהי דרישת חובה כדי ש-Yii תוכל לתקשר עם דאטבייס רלציוני.

בהנחה ש-PDO מותקנת אצלך, פתח את הקובץ config/db.php ושנה את הפרמטרים הנחוצים כדי ליצור חיבור עם הדאטאבייס על השרת שלך.

<?php
// שנה את מה שצריך כאן
return [
    'class' => 'yiidbConnection',
    'dsn' => 'mysql:host=localhost;dbname=yii2basic',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
];

הקובץ config/db.php הוא כלי הגדרה, שעוזר לאתחל ברקע מופע (instance) של אוביקט  yiidbConnection כדי שיהיה אפשר לתקשר עם הדאטאבייס.

אם אתה צריך לגשת לאוביקט הקונקשיין תוך כדי ריצה, תוכל לעשות זאת בפניה אל  Yii::$app->db.

הערה : הקובץ config/db.php נמשך (include) על ידי הקובץ  config/web.php שמאתחל את האוביקט  application. להרחבה בנושא הגדרות, בקר בקישור  Configurations.

 יצירה של ActiveRecord

כדי לגשת למידע מתוך הטבלה country, עלינו ליצור מחלקת בת של Active Record בשם של הטבלה – Country ולשמור את זה בקובץ models/Country.php.

<?php

namespace appmodels;

use yiidbActiveRecord;

class Country extends ActiveRecord
{
}

המחלקה Country מרחיבה (extends) את המחלקה  yiidbActiveRecord. בעיקרון , אתה לא צריך לרשום כלום בתוך המחלקה, כי Yii "תנחש" את הטבלה המשויכת למודל זה לבד.

הערה : אם אין סיכוי לנחש את השם מתוך שם ה-class, אתה יכול להגדיר את שם הטבלה בעצמך באמצעות המתודה yiidbActiveRecord::tableName().

עכשיו, אחרי שיש לנו מחלקה בשם Country, יהיה קל יותר לגשת למידע ולעשות מניפולציות עליו.

הנה כמה דוגמאות קוד לשליפת נתונים וגישה אליהם :

 

use appmodelsCountry;

// לשלוף את כל הרשומות מהטבלה ולמיין אותן לפי השדה name
$countries = Country::find()->orderBy('name')->all();

// שלוף את כל הרשומות עם מפתח ראשי שהוא US
$country = Country::findOne('US');

// להציג תוכן של שדה
echo $country->name;

// לשנות ערך בשדה ולשמור את השינוי בדאטאבייס
$country->name = 'U.S.A.';
$country->save();

הערה : גישה לנתונים באמצעות ActiveRecord היא דרך מאוד עוצמתית, מונחית עצמים. למידע נוסף בקר בקישור הבא :  Active Record

כדאי לדעת שיש אפשרות לבצע שאילתות בצורה "גולמית" יותר עם אוביקט אחר שנקרא Data Access Objects.

יצירת Action

כדי להציג לגולשים את תוכן הטבלה country, אנחנו צריכים ליצור action חדש. הפעם, במקום ליצור אותו בתוך ה-controller שנקרא site, אנחנו ניצור אותו בתוך controller חדש, שיהיה שייך ספציפית לטבלה הזו, ונקרא לו בשם CountryController, בתוך הקונטרולר החדש, ניצור מתודה/action בשם index כמו שמוצג בקוד הבא :

<?php

namespace appcontrollers;

use yiiwebController;
use yiidataPagination;
use appmodelsCountry;

class CountryController extends Controller
{
    public function actionIndex()
    {
        $query = Country::find();

        $pagination = new Pagination([
            'defaultPageSize' => 5,
            'totalCount' => $query->count(),
        ]);

        $countries = $query->orderBy('name')
            ->offset($pagination->offset)
            ->limit($pagination->limit)
            ->all();

        return $this->render('index', [
            'countries' => $countries,
            'pagination' => $pagination,
        ]);
    }
}

שמור את קטע הקוד הזה בקובץ  controllers/CountryController.php.

מה בעצם קורה בקוד ? המתודה/action שנקראת index קוראת ל Country::find() שזוהי מתודה מובנית לביצוע שאילתות DB , וכך מחזירה מידע מתוך הטבלה country .

כדי להגביל את מספר הרשומות המוצגות על המסך (ארצות במקרה זה) , אנחנו משתמשים באוביקט עימוד – yiidataPagination שמבצע מניפולציה על השאילתא, כך שנחזיר רק חלק מהרשומות – רק כמות מסוימת שנרצה להציג על המסך.

האוביקט הזה –yiidataPagination  יכול לסייע לנו בכמה צורות :

  • הוא מוסיף פסויקיות LIMIT ו-OFFSET למשפט ה-SQL של השאילתא. (במקרה שלנו הגבלנו ל-5 רשומות בכל דף).
  • הוא מאפשר להוסיף ל-view סט  של כפתורים לדילוג בין עמודים (1,2 וכו…)

בסוף הפונקציה index, אנו קוראים ל-render כדי ליצר view שנקרא index ומעבירים אליו את חבילת המידע על country, ביחד עם אוביקט העימוד שיצרנו.

יצירת ה-view

עכשיו, צור תיקיה חדשה תחת תיקית views וקרא לה country. התיקיה הזו תכיל את כל ה-views שקשורים לקונטרולר country. בתוך תיקית views/country צור קובץ חדש וקרא לו index.php ובתוכו הדבק את הקוד הבא :

<?php
use yiihelpersHtml;
use yiiwidgetsLinkPager;
?>
<h1>Countries</h1>
<ul>
<?php foreach ($countries as $country): ?>
    <li>
        <?= Html::encode("{$country->name} ({$country->code})") ?>:
        <?= $country->population ?>
    </li>
<?php endforeach; ?>
</ul>

<?= LinkPager::widget(['pagination' => $pagination]) ?>

ל-view יש 2 חלקים : החלק הראשון מציג את הרשומות מתוך הטבלה country בתור "רשימה" של html.

והחלק השני  יש widget של Yii שנותן את כפתורי מעבר בין עמודים. הוא נקרא yiiwidgetsLinkPager  .

נסה את זה בעצמך

כדי לראות את כל הקוד בפעולה, גלוש אל

http://hostname/index.php?r=country/index

זה צריך להיראות כך :

בראש הדף אתה תראה 5 מדינות, ומתחת להן, יופיעו כפתורי העימוד. אם תקליק על אחד מכפתורי העימוד, תראה כיצד מופיעות רשומות אחרות בהתאמה, ואם תשים לב, תראה שגם הכתובת בדפדפן משתנה בהתאם.

לדוגמא , עבור העמוד השני , הכתובת שתופיע היא :

http://hostname/index.php?r=country/index&page=2

 

מאחורי הקלעים, אוביקט העימוד – Pagination , מספק את כל היכולות הדרושות כדי שזה יקרה :

  • בתחילה, אוביקט Pagination מציג את העמוד הראשון, באמצעות פסוקית SQL  הבאה לסוף המשפט LIMIT 5 OFFSET 0. , כתוצאה מכך נקבל את 5 המדינות הראשונות.
  • רכיב ה-  LinkPager מרנדר את הכפתורים למטה, כשכל כפתור מכיל URL עם פרמטר page לעמוד אחר.
  • כאשר אנו מקליקים על "2" לדוגמא, אז אוביקט ה- Pagination מקבל את הפרמטר, ומוסיף לסוף משפט ה-SQL את הפסוקית LIMIT 5 OFFSET 5 ומחזיר את המדינות הבאות בהתאם.

סיכום – עבודה עם דאטאבייסים ב- Yii 2

במדריך הזה למדת כיצד לעבוד עם דאטאבייס, בנוסף למדת על השימוש באוביקט yiidataPagination , וברכיב ה yiiwidgetsLinkPager .

במדריך הבא נראה איך להשתמש בכלי ה-Gii, כלי עוצמתי של Yii המאפשר לחסוך המון זמן באמצעות כך שהוא בונה עבורך חלקים שלמים באפליקציה – מודלים, CRUD, ועוד.

המדריך מפורסם לפי התנאים של Yii, והמקור נמצא כאן

 

מדריך Yii 2 – עבודה עם Gii – כלי ליצירה אוטומטית של קוד

במדריך הקודם, דיברנו עם עבודה עם דאטאבייסים ב-Yii, במדריך הזה נציג כלי מדהים שנקרא Gii שמקל מאוד על משימות שגרתיות בפיתוח האפליקציה.

Gii הוא מחולל קוד אוטומטי, שמאפשר בצורה פשוטה מאוד, רק צריך להקליד את המידע הנכון בשדות הנכונים, כמה לחיצות, והקוד מיוצר אוטומטית.

במדריך הזה נלמד :

  • איך לאפשר את הפעלת הכלי Gii בשרת הפיתוח שלך
  • ליצור מחלקת ActiveRecord באמצעות Gii
  • ליצור את כל פעולות ה-CRUD באמצעות Gii
  • שינוי של קוד שנוצר ב-Gii

איך להפעיל את המודול Gii

Gii הוא מודול של Yii. וכדי להפעיל אותו, צריך לפני כן לאפשר אותו. בעיקרון , ברירת המחדל של קובץ ההגדרות נמצאת ב : config/web.php , היכנס לשם, ותשנה את השורות הרלוונטיות :

$config = [ ... ];

if (YII_ENV_DEV) {
    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = 'yiigiiModule';
}

כמו שבוודאי שמת לב, התנאי בקטע הקוד בודק האם המשתנה YII_ENV_DEV הוא true, ואם כן, מפעיל את המודול.

משתנה זה הוא משתנה שקובע האם אתה בסביבת פיתוח או יצור (production). ואם הסביבה היא סביבת פיתוח, אז האפלקציה עושה include למחלקה שהיא המודול הזה – מחלקת yiigiiModule.

אז כדי לוודא שהמשתנה הזה מכוון אצלך על סביבת פיתוח, עליך לבדוק ש בקובץ  web/index.php (מה שנקרא entry script - הכוונה לסקריפט שדרכו מנותבת כל התנועה ב Yii) 

מופיעה ההגדרה הבאה שקובעת את ערך המשתנה ל-true  :

defined('YII_ENV') or define('YII_ENV', 'dev');

השורה הזו קובעת בפועל שאתה ב-development mode  והכלי Gii מאופשר.

עכשיו אתה יכול לגלוש אל הכלי :

http://hostname/index.php?r=gii

שים לב : אם אתה עובד על שרת שאיננו localhost , אזי Gii יחסם אוטמטית, מטעמי אבטחה. אם תרצה לאפשר זאת על השרת, תצטרך לציין IP של השרת בהגדרה הבאה :

'gii' => [
    'class' => 'yiigiiModule',
    'allowedIPs' => ['127.0.0.1', '::1', '192.168.0.*', '192.168.178.20'] // adjust this to your needs
],

 

וכך נראה הכלי Gii – במסך הכניסה : 

 

2 הערות חשובות לפני שמתקדמים

  1. הכלי הולך לייצר קבצים, אז אם שרת הפיתוח שלך מבוסס לינוקס, כדאי לוודא שיש ליוזר של אפצ'ה הרשאות כתיבה מלאות.
  2. במידה ואתה מייצר הרבה קבצים, וחלקם דורסים קבצים ישנים יותר, שים לב שאתה מסמן כל מה שצריך ב-overwrite, אחרת תקבל הודעות שגיאה.

איך לייצר מחלקה של Active Record באמצעות Gii ?

כדי להשתמש ב-Gii ליצור class של Active Record, בחר ב-Model Generator, ואז מלא את הפרטים הבאים בטופס :

  • Table Name: country
  • Model Class: Country

וכך זה צריך להיראות : 

 

עכשיו, לחץ על Preview, אתה תראה את הקובץ models/Country.php ברשימת התוצאות, אתה יכול ללחוץ על שם הקובץ אם אתה רוצה לראות את תוכנו – הקוד עצמו.

כאשר משתמשים ב-Gii, אם יש קובץ קודם בעל אותו שם – הוא ידרס, אם רוצים לראות את ההבדלים בקוד לעומת הגירסה הקודמת, לחץ diff .

השלב הבא הוא ללחוץ על Generate, ואז לאשר את ה-overwrite.

יצירת CRUD עם הכלי Gii

המונח CRUD מתאר את הפעולות הבסיסיות בדאטאבייס – יצירה, קריאה, עדכון ומחיקה, וניתן ליצור את כל רצף ה-actions וה-view עם המודל והקונטרולר במהירות באמצעות Gii.

כדי לעשות זאת לחץ על CRUD Generator, ואם נמשיך עם הדוגמא של טבלת Country, אז צריך למלא את הערכים הבאים :

  • Model Class: appmodelsCountry
  • Search Model Class: appmodelsCountrySearch
  • Controller Class: appcontrollersCountryController

זה צריך להיראות כך :

והמסך הבא (אחרי לחיצה על Preview) נראה כך : 

אם יצרת במדריכים הקודמים את הקונטרולר ואת ה-Index, אז תצטרך לאשר דריסה (overwrite) אחרי לחיצה על Generate.

 נסה את זה בעצמך

כדי לראות את כל מה שנוצר , גלוש אל

http://hostname/index.php?r=country/index

 

אתה תראה רשימה של המדינות, כאשר יש מעל כל עמודה אפשרות חיפוש, ולצד כל עמודה מופיעות האפשרויות לערוך, למחוק ולצפות.

 

אפשרות העדכון נראית כך : 

 

הקבצים שנוצרו על ידי Gii הם הקבצים הבאים, אתה מוזמן להיכנס אליהם ולשנות אותם לפי הצורך :

  • Controller: controllers/CountryController.php
  • Models: models/Country.php and models/CountrySearch.php
  • Views: views/country/*.php

מידע: Gii נועד להיות כלי יצירת קוד אוטומטי, כדי לאפשר לך התאמה אישית של הקוד והרחבה. אם תשתמש בו בתבונה, תוכל להאיץ את מהירות הפיתוח משמעותית.

סיכום – שימוש בכלי Gii של Yii

בסעיף זה ראית כיצד להשתמש בחלק מיכולותיו של Gii, בין השאר גם לחולל את פעולות ה-CRUD.

 

המדריך מפורסם לפי התנאים של Yii, והמקור נמצא כאן

שימוש בוורד / אקסל / PP על שרת ווינדוס עם php

לאחרונה בפרויקט מסוים היינו צריכים להשתמש בתוספות COM של PHP

כלומר להפעיל בצד השרת אקסל / וורד וכדומה.

התקנו שרת ווינדוס עם Wamp , ועליו מותקנות גם התוכנות הרלוונטיות (אקסל / וורד)

כדי שתוספת ה-COM תוכל לעבוד , צריך לאפשר אותה בתהליך הבא :

  • Run “dcomcnfg” to get to Component Services
  • Open Component Services > Computers > My Computer > DCOM Config
  • Search for Microsoft Excel Application or the appropriate application you working with on COM
  • Right-Click on it and open the properties
  • Choose “Identity” tab
  • Normally this is set to “the launching user” by default. You have to change this to “the interactive user”.
  • Apply these new settings and test your COM application. It should work fine now.

מקור : http://stackoverflow.com/questions/11704440/uncaught-exception-com-exception-with-message-bsource-b-microsoft-office

 

לאחר שמאפשרים את התוספת, אפשר בקלות להשתמש ב-word/Excel –

להלן דוגמא ב-php  מתוך התיעוד הרשמי

Version}n";

//bring it to front
$word->Visible = 1;

//open an empty document
$word->Documents->Add();

//do some weird stuff
$word->Selection->TypeText("This is a test...");
$word->Documents[1]->SaveAs("Useless test.doc");

//closing word
$word->Quit();

//free the object
$word = null;
?> 

חיבור דינמי לדאטאבייסים רבים ב-Laravel

יש לי פרויקט שבו לכל יוזר יש דאטאבייס משלו.
עכשיו, תוך כדי ריצה, אני צריך להתחבר לדאטאבייס הנכון.
הפרויקט הוא על Laravel ( כיום 5).

אז השלב הראשון לפתרון העניין, הוא הוספה דינמית של הגדרה.
כלומר – כידוע, בדרך כלל ההגדרות של הדאטאבייסים ב-Laravel יושבות במערך שמוגדר בקובץ database.php בתיקית config.

עכשיו, כיוון שזאת הגדרה לכל דבר ועניין, אז laravel מאפשרת להוסיף הגדרות דינמיות , באמצעות המתודה Config::set.

אז ככה אני מגדיר דאטאבייס חדש , מה שנקרא "on the fly", כלומר תוך כדי ריצה :

 Config::set('database.connections.'.'YOUR KEY COME HERE', array(
            'driver'    => 'mysql',
            'host'      => env('DB_HOST', 'localhost'),
            'database'  => $this->dbName,
            'username'  => env('DB_USERNAME', 'root'),
            'password'  => env('DB_PASSWORD', 'YOUR PASSWORD COME HERE'),
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
                     ));

נא תשומת לב למספר נקודות :
1. השתמשתי ב-dot.notation, כלומר בתחביר של נקודה מפרידה, ו-Laravel יודעת להפריד אותו לבד.
2. המקום שבו סימנתי Your key come here – מיועד כמובן, כדי לתת שם יחודי ל-Connection הזה.

ועכשיו, אחרי שהגדרנו –
אז נשאר לבצע שאילתות.
אני אדגים על שאילתא בצורה גולמית, בלי להתייחס במאמר הזה ל-Eloquoent בינתיים.
אז נניח ואני רוצה לבצע שאילתת select על טבלת users באותו דאטאבייס שאליו התחברתי :
זה הולך ככה :

 $results = DB::connection($user->id)->select('select * from users where id > ?', [0]);

זהו, ראינו כאן איך להתחבר באופן דינמי לדאטאבייסים ב-laravel.
יום נעים
איל

16824283970_515f904232_laravel

המשך מדריך – עבודה בלאראוול עם דאטאבייסים רבים – שיתוף מודל Laravel Mulitiple Databases – Share your models

laravel share your model
Photo by nesimo

בהמשך למדריך הקודם – שבו הראתי איך מתחברים לדאטבייסים שונים, תוך כדי ריצה (on the fly).

עכשיו החלק הבא – הוא לראות איך יוצרים מודל אחד – אבל משתמשים בו בדאטאבייסים שרלוונטי באותו רגע ליוזר.

אז ב-Laravel זה ממש פשוט.

אחת המתודות של המודל שאפשר לשרשר, היא on והיא קובעת לאיזה דאטאבייס מתייחסים , פשוט עם שם הדאטאבייס הרלוונטי.

אז יוצרים את המודל – לגמרי כרגיל.

וניגשים אליו , נניח עם count , בצורה הבאה :

 $results = AppPolicy::on($user->id)->where('PolicyInitialNum', '>', 0)->count();

בדוגמא שהבאתי המודל נקרא כמובן Policy.
ובאותה צורה אפשר לגשת לכל מודל שרוצים.

בהצלחה!

3077990150_709af8df13_xml

להפוך DomNodeList למערך. PHP – DomDocument – Convert DomNodeList to Assosiative array

xml DomNodeList To php array
Photo by dpstyles™

האובייקטים של DomDocument ב-php הם מתעתעים, היות והם לא מתנהגים כרגיל, ולא מאפשרים לעשות עליהם var_dump וכדומה.

להלן פונקציה פשוטה, לא רקורסיבית, שהופכת DomNodeList למערך אסוציאטיבי.

נא תשומת לב – כדי לקבל DomNodeList אפשר פשוט להשתמש על אוביקט ה-XML במתודה getElementsByTagName

ומה שמקבלים בחזרה – הוא אוביקט DomNodeList


/* Get DomNodeList Object
* and return an assosiative array
* This function is NOT recursive
*/
function DomNodeListToArray(DOMNodeList $domNodeList)
{
$items = $domNodeList;
$headlines = array();

foreach($items as $item) {
$headline = array();

if($item->childNodes->length) {
foreach($item->childNodes as $i) {
$headline[$i->nodeName] = $i->nodeValue;
}
}

$headlines[] = $headline;
}
return $headlines;
}

 

מקור – ההערות של הדוקומטציה http://php.net/manual/en/domdocument.getelementsbytagname.php

איך להחזיר ב-Laravel רשימה עבור select במהירות ?

פעמים רבות, כאשר אנו יוצרים טופס HTML, צריך לשלוף רשימה מתוך טבלה ב-DB ולשים אותה בתוך select בטופס ה-HTML.
כאשר פעמים רבות, לכל ערך יש מפתח בטבלה, ואותו נרשום ב-select בתור ה-value.
ב-laravel יש צורה ממש פשוטה לעשות זאת, הן ישירות על הדאטאבייס והן עם מודל של Eloquent .

ישירות מהדאטאבייס :

DB::table('foo')->list('name','value');

ועל מודל של Eloquent זה עובד דומה, אבל משום מה המתודה מסתיימת ב-S

להלן דוגמא מפרויקט שלי על מודל של Eloquent :

AppJob::where('company','=',$company->company)->lists('job','id');

מה שזה מחזיר – זה מחזיר בכל מקרה מערך רגיל, כשהמפתח הוא עמודת המפתח שציינו, והערך – הוא עמודת הערך.

 

אז כדי ליישם את זה בתבנית של Blade זה נראה כך


                        @foreach($list as $key => $value)
                            
                        @endforeach
                  

פעולת Distinct על עמודה בודדת ב-Laravel

ל-Laravel יש פעולת distinct על שאילתא, אבל היא עובדת על כל העמודות.
במידה וצריך רק על עמודה בודדת, אפשר להשתמש ב-GroupBy על אותה עמודה
למשל במקרה הזה הייתי צריך את שמות החברות,
וככה נראית הפקודה

foreach( DB::connection('helper')->table('jobs')->select('company')->groupBy('company')->get() as $company) {

בהצלחה!