Laravel LeftJoin возвращает повторяющееся значение из первого столбца (mysql) - PullRequest
0 голосов
/ 24 августа 2018

Работники колонок: enter image description here

Рекомендации по колонкам: enter image description here

Мой запрос:

$getRecommendationWorker = Worker::select('workers.id', 'workers.name', 'workers.photo', 'workers.description', 'workers.profile_worker', 'recommendations.recommendation', 'recommendations.author', 'recommendations.work_author', 'recommendations.profile_author')
->leftJoin('recommendations', 'workers.id', '=', 'recommendations.worker_id')
->get();

Возврат Laravel:

{"id":5,"name":"Piotr Debowski","photo":"3c29641e2a.jpeg","description":"sdasdasd","profile_worker":"https:\/\/codepen.io\/","recommendation":"pierwsza rekomendacja","author":"Jan Kowalski","work_author":"IT spec","profile_author":"https:\/\/stackoverflow.com\/questions\/43136250\/eloquent-join-table-with-two-conditions"}
{"id":5,"name":"Piotr Debowski","photo":"3c29641e2a.jpeg","description":"sdasdasd","profile_worker":"https:\/\/codepen.io\/","recommendation":"druga rekomendacja","author":"Jan Wo\u017aniak","work_author":"dsad","profile_author":"https:\/\/nczas.com\/2018\/08\/21\/wreszcie-zatrzymali-t"}

У меня есть id, name и другое значение из таблицы workers, дважды возвращенное.Я хочу, чтобы return выглядела так:

{"id":5,"name":"Piotr Debowski","photo":"3c29641e2a.jpeg","description":"sdasdasd","profile_worker":"https:\/\/codepen.io\/","recommendation":"pierwsza rekomendacja","author":"Jan Kowalski","work_author":"IT spec","profile_author":"https:\/\/stackoverflow.com\/questions\/43136250\/eloquent-join-table-with-two-conditions","recommendation":"druga rekomendacja","author":"Jan Wo\u017aniak","work_author":"dsad","profile_author":"https:\/\/nczas.com\/2018\/08\/21\/wreszcie-zatrzymali-t"}

Я хочу из таблицы workers вернуть только одну строку, а из таблицы recommendations все записи, относящиеся к первой таблице.Когда я использую groupBy (например: ...->->groupBy('workers.id')), возвращайте мне только первую запись из таблицы recommendations.Я не могу использовать where, потому что все значения будут отображаться на одной странице.Столбец worker_id относится к таблице workers

РЕДАКТИРОВАТЬ:

Модель работника:

public function recommendations()
{
    return $this->hasMany('App\Recommendation');
}

Модель рекомендации:

public function workers()
{
    return $this->belongsTo('App\Worker');
}

1 Ответ

0 голосов
/ 24 августа 2018

Самый простой способ сделать это - загрузить recommendations отношение:

$workers = Worker::with('recommendations')->get();

, а затем получить доступ к рекомендациям, просматривая их, например,

@foreach($workers as $worker)

    @foreach($worker->recommendations as $recommendation)

        //

    @endforeach

@endforeach

Однако, если вы хотите, чтобы строки были отформатированы, как в примере из вашего вопроса, вы можете воспользоваться тем фактом, что они коллекции :

$workers = Worker::with('recommendations')->get()
    ->flatMap(function ($worker) {

        $recommendations = $worker->recommendations->isEmpty()
            ? collect([new \App\Recommendation])
            : $worker->recommendations;

        return $recommendations->map(function ($recommendation) use ($worker) {
            return (object)[
                'id'             => $worker->id,
                'name'           => $worker->name,
                'photo'          => $worker->photo,
                'description'    => $worker->description,
                'profile_worker' => $worker->profile_worker,
                'recommendation' => $recommendation->recommendation,
                'author'         => $recommendation->author,
                'work_author'    => $recommendation->work_author,
                'profile_author' => $recommendation->profile_author,
            ];
        });
    });
...