Đối số nhỏ gọn 1 phải là chuỗi hoặc mảng chuỗi IlluminateDatabaseEloquent Collection đã cho

Phương thức whereIn xác minh rằng giá trị của một cột nhất định được chứa trong mảng đã cho

Thay đổi mã của bạn

$media = $media->whereIn('med_name', request('fileName'));
$media = $media->where('med_name', request('fileName'));

Chúng tôi có một trang quản lý đăng ký của bạn với một vài trường tùy chỉnh như tên công ty, địa chỉ, v.v.

Tuy nhiên, khi mọi người thay đổi thông tin trong trường của họ, một lỗi nghiêm trọng sẽ xảy ra. PHP Lỗi nghiêm trọng. Lỗi loại chưa bắt được. cắt (). Đối số #1 ($string) phải là kiểu chuỗi, mảng được cho trong …. /public_html/wp-content/plugins/mailpoet/lib/Subscription/Quản lý. php. 179

dấu vết ngăn xếp
#0 /home/bloemenc/domains/bloemencorso-bollenstreek. nl/public_html/wp-content/plugins/mailpoet/lib/Đăng ký/Quản lý. php(179). cắt ()
#1 /nhà/bloemenc/miền/bloemencorso-bollenstreek. nl/public_html/wp-content/plugins/mailpoet/lib/Đăng ký/Quản lý. php(110). MailPoet\Subscription\Manage->filterOutEmptyMandatoryFields()
#2 /nhà/bloemenc/miền/bloemencorso-bollenstreek. nl/public_html/wp-gồm/class-wp-hook. php(303). MailPoet\Subscription\Manage->onSave()
#3 /nhà/bloemenc/miền/bloemencorso-bollenstreek. nl/public_html/wp-gồm/class-wp-hook. php(327). WP_Hook->apply_filters()
#4 /nhà/bloemenc/miền/bloemencorso-bollenstreek. nl/public_html/wp-gộp/plugin. php(470). WP_Hook->do_action()
#5 /nhà/bloemenc/miền/bloemencorso-bollenstreek. nl/public_html/wp-admin/admin-post. php(51). do_action()
#6 {chính}
ném vào /home/bloemenc/domains/bloemencorso-bollenstreek. nl/public_html/wp-content/plugins/mailpoet/lib/Đăng ký/Quản lý. php trên dòng 179`

có biết thứ gì gây ra không?

Nhìn về phía trước

  • Chủ đề này đã được sửa đổi 1 năm, 3 tháng trước bởi kees78 .

Đang xem 4 trả lời - 1 đến 4 (trong tổng số 4)

  • Hỗ trợ plugin Elvira K. a11n

    (@treibalen)

    Xin chào @kees78,

    Cảm ơn bạn đã liên hệ

    Bạn có thể vui lòng cho tôi biết bạn đang sử dụng phiên bản MailPoet nào không?

    Mong muốn được nghe từ quý vị

    Hỗ trợ plugin Elvira K. a11n

    (@treibalen)

    Xin chào @kees78,

    Chúng tôi chưa nhận được phản hồi từ bạn trong một thời gian, vì vậy tôi sẽ đánh dấu vấn đề này là đã giải quyết – chúng tôi sẽ ở đây nếu và/hoặc khi bạn sẵn sàng tiếp tục

    Bạn đã bao giờ muốn truy cập một thuộc tính của mô hình Eloquent dưới dạng một đối tượng giá trị, tương tự như cách Eloquent cho phép chúng tôi làm việc với ngày tháng thông qua Carbon chưa?

    $user->address->calculateDistance($otherUser->address);

    Hầu hết các đối tượng giá trị có nhiều thuộc tính. Đó là một phần của những gì phân biệt chúng với các kiểu nguyên thủy như chuỗi và số nguyên. Một số có thể có các định dạng đặc biệt cho phép chúng tôi biểu diễn các thuộc tính riêng lẻ dưới dạng một chuỗi. Ví dụ: một ngày có thể đại diện cho năm, tháng và ngày là

    use Illuminate\Database\Eloquent\Model;

    8 nhưng chúng tôi vẫn có thể tách nó ra nếu cần và cơ sở dữ liệu biết cách truy vấn các phần riêng lẻ

    Chúng ta có thể không phải lúc nào cũng may mắn với các đối tượng giá trị của mình. Vì vậy, chúng ta có thể bị cám dỗ để tạo ra các quy ước của riêng mình. Tuy nhiên, cơ sở dữ liệu sẽ không thể truy vấn các bộ phận một cách dễ dàng và tùy thuộc vào số lượng loại thuộc tính, cơ sở dữ liệu có thể trở nên khó sử dụng

    Chúng tôi có thể tạo các cột chuyên dụng trong cơ sở dữ liệu cho từng thuộc tính. Các tài liệu của Laravel có một ví dụ tuyệt vời về cách chúng ta có thể

    Nhưng trong một số trường hợp, chúng tôi có thể muốn cấu trúc lồng nhau hoặc có thể chúng tôi có nhiều trường tùy chọn mà chúng tôi không muốn làm lộn xộn cấu trúc bảng. Có lẽ chúng tôi có một bộ sưu tập các mặt hàng không xứng đáng trên bàn của họ. Có nhiều lý do khiến bạn có thể muốn xem xét một cột JSON

    Các cột JSON cung cấp cho chúng tôi một cách hiệu quả các lợi ích (và nhược điểm) của cơ sở dữ liệu dựa trên tài liệu/NoSQL bên trong cơ sở dữ liệu quan hệ của chúng tôi. Và các công cụ cơ sở dữ liệu hiện đại có thể lập chỉ mục và truy vấn nguyên bản bên trong các cấu trúc JSON này khá tốt

    Vậy các tùy chọn của chúng tôi để làm việc với các cột JSON trong Laravel là gì?

    Bạn có thể quen thuộc với tính năng truyền được tích hợp sẵn sau đây

    use Illuminate\Database\Eloquent\Model;

    Điều này sẽ tự động truyền một mảng (kết hợp hoặc số) sang JSON và ngược lại. Rất tiện dụng

    Bạn cũng có thể quen thuộc với

    use Illuminate\Database\Eloquent\Model;

    Điều này thực hiện tương tự, nhưng đối với đối tượng

    use Illuminate\Database\Eloquent\Model;

    9. Điều này cũng rất tuyệt, nhưng trên thực tế, tôi nhận thấy một mảng kết hợp thường dễ làm việc hơn với

    Bây giờ hãy tưởng tượng truyền tới một thể hiện của một lớp đối tượng giá trị cụ thể thông qua Laravel's

    use Illuminate\Database\Eloquent\Model;

    'address' => Address::class,

    Bây giờ mọi thứ đang trở nên khá tốt đẹp

    Nhưng hãy thực hiện thêm một bước nữa và làm cho lớp đối tượng giá trị có thể truyền được bằng cách triển khai giao diện

    use Illuminate\Database\Eloquent\Model;

    0

    use App\Casts\Address as AddressCast;

    use Illuminate\Contracts\Database\Eloquent\Castable;

    class Address implements Castable

    public static function castUsing(array $arguments)

    return AddressCast::class;

    Và bây giờ chúng ta có thể truyền tới chính lớp đối tượng giá trị, thay vì truyền tùy chỉnh, điều này chỉ cảm thấy đẹp hơn một chút

    'address' => Address::class,

    Ồ vâng vâng

    Đối với logic truyền, việc tuần tự hóa giữa JSON và mảng hoặc đối tượng

    use Illuminate\Database\Eloquent\Model;

    9 khá đơn giản với

    use Illuminate\Database\Eloquent\Model;

    2 và

    use Illuminate\Database\Eloquent\Model;

    3. Diễn viên tùy chỉnh của chúng tôi có thể bao bọc những thứ này và khởi tạo đối tượng giá trị của chúng tôi và mọi thứ sẽ khá thú vị

    Làm thế nào chúng ta có thể phát triển nó hơn nữa, ngoài tài liệu?

    Bạn có biết điều gì làm cho việc làm việc với cấu trúc mảng trong PHP thậm chí còn đẹp hơn không?

    composer require spatie/data-transfer-object

    Điều này mở ra một vài điều bổ sung

    • Dữ liệu được xác thực để đảm bảo dữ liệu tuân theo cấu trúc và loại đã xác định, nếu không thì sẽ bị loại bỏ
    • Nó xử lý truyền mảng thô đến và từ một phiên bản của lớp tùy chỉnh của chúng tôi

    Chúng ta chỉ cần xác định các thuộc tính

    use App\Casts\Address as AddressCast;

    use Illuminate\Contracts\Database\Eloquent\Castable;

    use Spatie\DataTransferObject\DataTransferObject;

    class Address extends DataTransferObject implements Castable

    public static function castUsing(array $arguments)

    return AddressCast::class;

    Tôi muốn lưu trữ những thứ này trong

    use Illuminate\Database\Eloquent\Model;

    4 vì tôi thường sẽ thêm các phương thức dành riêng cho miền để làm cho nó giống một đối tượng giá trị hơn là một DTO đơn giản. Vui lòng lưu trữ nó ở bất kỳ đâu bạn muốn, chẳng hạn như

    use Illuminate\Database\Eloquent\Model;

    5 hoặc thậm chí trong cùng thư mục với các mẫu của bạn

    Cũng lưu ý rằng chúng tôi không giới hạn các loại nguyên thủy ở đây - chúng tôi có thể bao gồm các lớp khác bao gồm các đối tượng truyền dữ liệu lồng nhau. Chúng tôi cũng có thể đánh dấu các thuộc tính là nullable để biến chúng thành tùy chọn. Gói của Spatie thậm chí còn cho phép chúng tôi xác định các mảng của mọi thứ và cả các loại liên kết. Một số trong đó sẽ có sẵn trong PHP 8. Hãy xem tài liệu về gói đối tượng truyền dữ liệu để biết cách xác định tất cả những thứ này

    Tại thời điểm này, dàn diễn viên tùy chỉnh của

    use Illuminate\Database\Eloquent\Model;

    6 có thể trông giống như thế này

    use App\Values\Address as AddressValue;

    use Illuminate\Contracts\Database\Eloquent\CastsAttributes;

    class Address implements CastsAttributes

    * Cast the stored value to an Address.

    public function get($model, $key, $value, $attributes)

    * We'll need this to handle nullable columns

    return new AddressValue(json_decode($value, true));

    * Prepare the given value for storage.

    public function set($model, $key, $value, $attributes)

    * We'll need this to handle nullable columns

    * Allow the user to pass an array instead of the value object itself.

    * Similar to how we can pass a date string or a Carbon/DateTime object with a date cast.

    $value = new AddressValue($value);

    if (! $value instanceof AddressValue) {

    throw new InvalidArgumentException('Value must be of type Address, array, or null');

    return json_encode($value->toArray());

    Nhưng hãy lưu ý rằng không có gì thực sự cụ thể đối với đối tượng giá trị

    use Illuminate\Database\Eloquent\Model;

    6 trong cách truyền tùy chỉnh của chúng ta, ngoại trừ chính tên lớp. Nếu có nhiều đối tượng truyền dữ liệu, chúng ta có thể thực hiện thêm một bước này bằng cách chỉ định lớp DTO thông qua hàm tạo để truyền có thể sử dụng lại

    use Illuminate\Contracts\Database\Eloquent\CastsAttributes;

    class DataTransferObject implements CastsAttributes

    * @param string $class The DataTransferObject class to cast to

    public function __construct(string $class)

    * Cast the stored value to the configured DataTransferObject.

    public function get($model, $key, $value, $attributes)

    return new $this->class(json_decode($value, true));

    * Prepare the given value for storage.

    public function set($model, $key, $value, $attributes)

    $value = new $this->class($value);

    if (! $value instanceof $this->class) {

    throw new InvalidArgumentException("Value must be of type [$this->class], array, or null");

    return json_encode($value->toArray());

    Và bây giờ, phương thức

    use Illuminate\Database\Eloquent\Model;

    9 của đối tượng giá trị ________3____6 của chúng tôi có thể được cập nhật như vậy

    use Illuminate\Database\Eloquent\Model;

    0

    Công cụ tái cấu trúc khác duy nhất mà tôi thích là tạo một lớp

    use Illuminate\Database\Eloquent\Model;

    'address' => Address::class,

    0 mà lớp

    use Illuminate\Database\Eloquent\Model;

    6 của tôi và những lớp khác có thể mở rộng. Bằng cách đó, họ không cần phải lo lắng về việc làm cho mình có thể sử dụng được

    use Illuminate\Database\Eloquent\Model;

    1

    use Illuminate\Database\Eloquent\Model;

    'address' => Address::class,

    2 và

    use Illuminate\Database\Eloquent\Model;

    'address' => Address::class,

    3 là một điểm nhấn bổ sung đẹp hơn để gói gọn chuỗi DTO thay vì đưa nó vào dàn diễn viên. Ngoài ra, hãy chắc chắn kiểm tra PHP an toàn nếu bạn chưa

    Lớp đối tượng giá trị

    use Illuminate\Database\Eloquent\Model;

    6 của chúng tôi hiện siêu gọn gàng

    use Illuminate\Database\Eloquent\Model;

    2

    Và hãy nhớ rằng chúng ta có thể truyền trực tiếp đến lớp này trong mô hình Eloquent của mình

    use Illuminate\Database\Eloquent\Model;

    3

    Khi tất cả được nói và làm xong, chúng ta chỉ cần các lớp sau

    use Illuminate\Database\Eloquent\Model;

    4

    Và bây giờ chúng ta có thể làm những thứ hay ho như

    use Illuminate\Database\Eloquent\Model;

    5

    use Illuminate\Database\Eloquent\Model;

    6

    Và cuối cùng, chúng ta hoàn toàn có thể nhận ra đối tượng giá trị của mình bằng cách tạo một API phong phú cho các phương thức cụ thể theo địa chỉ trên lớp

    use Illuminate\Database\Eloquent\Model;

    6 của chúng ta, lớp này hiện là đối tượng truyền dữ liệu lai và đối tượng giá trị. Một đối tượng giá trị truyền dữ liệu

    use Illuminate\Database\Eloquent\Model;

    7

    Nếu bạn muốn sử dụng

    use Illuminate\Database\Eloquent\Model;

    'address' => Address::class,

    0 trong dự án của mình, tôi đã tạo một gói để bạn chỉ cần mang theo các lớp học của riêng mình