【问题标题】:Laravel 5.4: concat data from related table in pluckLaravel 5.4:从相关表中提取数据
【发布时间】:2017-04-30 12:28:23
【问题描述】:

我正在为广播新闻节目编写分配系统。数据表:

station
id | calls
---| -----
 1 | cxri

newscast
id | name_input | for_station_id
---|------------|---------------
 1 | am         |  1

assignment
id | newscast_id | user_id
 1 |       1     |  5

Assignment.edit的控制器如下:

if (! Gate::allows('assignment_edit'))
    return abort(401);
    }
    $relations = [
        'anchors' => \App\User::get()->pluck('name', 'id')->prepend('Please select', ''),
        'casts' => \App\Newscast::get()->pluck('name_input', 'id')->prepend('Please select', ''),
    ];

    return view('assignment.create', $relations);

新闻广播模型:

public function for_station()
{
    return $this->belongsTo(Station::class, 'for_station_id')->withTrashed();
}

现在我明白了

"casts" => Collection {#451 ▼
    #items: array:2 [▼
      "" => "Please select"
      1 => "am"
    ]
}

我想要

"casts" => Collection {#451 ▼
    #items: array:2 [▼
      "" => "Please select"
      1 => "cxri-am"
    ]
}

我该如何做到这一点?

或者我应该对数据进行非规范化并使用 name_input 'cxri-am' 而不是 'am'?

我的尝试:
Laravel pluck fields from relations 接受的答案

'casts' => \App\Newscast::with('station')->get()->pluck('name_input', 'id'),

错误

Call to undefined relationship [station] on model [App\Newscast]

我根据Laravel: get/show data from related tables 中的讨论包含了上面的新闻广播模型。基于该讨论,在我看来,新闻广播应该已经能够访问电台呼叫。但如上所示,调用不在 $casts 中。

【问题讨论】:

    标签: laravel laravel-5.4


    【解决方案1】:

    你已经接近你所尝试的。 with() 函数需要关系函数的名称,而不是表,所以这应该可以加载关系模型:

    'casts' => \App\Newscast::with('for_station')->get(),
    

    至于让数据以你想要的方式连接,我会在Newscast 模型上创建一个accessor,它将返回你想要的数据:

    function getNameInputStationAttribute() {
        return $this->for_station->calls . "-" . $this->input_name;
    }
    

    然后你可以这样使用:

    'casts' => \App\Newscast::with('for_station')->get()->pluck('name_input_station', 'id')->prepend('Please select', ''),
    

    如果我能指出一些其他的事情,401 的返回码表示Unauthenticated,而403 表示Unauthorized,这更适用于Gate 返回 false。此外,类函数应该是cammel case,所以你的for_station函数应该是forStation或者甚至只是station

    【讨论】:

    • 谢谢@JRLambert!这很好用。我还将进行您提到的其他一些更改,并感谢您的指点!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 2020-12-05
    • 2018-01-06
    • 2023-04-06
    • 1970-01-01
    • 2019-10-10
    相关资源
    最近更新 更多